如何在 Pandas 中添加一个按时间间隔编号的新分类列
Posted
技术标签:
【中文标题】如何在 Pandas 中添加一个按时间间隔编号的新分类列【英文标题】:How to add a new categorical column with numbering as per time Interval in Pandas 【发布时间】:2021-10-28 00:17:52 【问题描述】: Value
2021-07-15 00:00:00 10
2021-07-15 06:00:00 10
2021-07-15 12:00:00 10
2021-07-15 18:00:00 10
2021-07-16 00:00:00 20
2021-07-16 06:00:00 10
2021-07-16 12:00:00 10
2021-07-16 18:00:00 20
我想添加一列这样当它出现时
00:00:00 1
06:00:00 2
12:00:00 3
18:00:00 4
最终,我想要这样的东西
Value Number
2021-07-15 00:00:00 10 1
2021-07-15 06:00:00 10 2
2021-07-15 12:00:00 10 3
2021-07-15 18:00:00 10 4
2021-07-16 00:00:00 20 1
2021-07-16 06:00:00 10 2
2021-07-16 12:00:00 10 3
2021-07-16 18:00:00 20 4
等等
我希望 Numbering 列在 00:00:00 时始终显示 1,在 06:00:00 时始终显示 2,在 12:00:00 时始终显示 3,无论何时现在是 18:00:00 时间,它总是说 4。这样,我将有一个只有 1,2,3,4 值的分类列
【问题讨论】:
【参考方案1】:抱歉,这里是新人,所以我没有足够的代表发表评论。但是@Keiku 的解决方案比你想象的更接近。如果您将 .time 替换为 .hour,您将获得一天中的小时。除以 6 得到 0:00 到 18:00 的 0-3 个类别。如果您必须将它们具体放在 1-4 范围内,只需添加 1。
借用@Keiku的示例代码:
import pandas as pd
df = pd.DataFrame(
'2021-07-15 00:00:00 0.48',
'2021-07-15 06:00:00 80.00',
'2021-07-15 12:00:00 6.10',
'2021-07-15 18:00:00 1400.00',
'2021-07-16 00:00:00 1400.00'
, columns=['value'])
df['date'] = pd.to_datetime(df['value'].str[:19])
df.sort_values(['date'], ascending=[True], inplace=True)
df['category'] = df['date'].dt.hour / 6 # + 1 if you want this to be 1-4
【讨论】:
【参考方案2】:您可以使用pd.to_datetime
转换为日期时间,使用.dt.time
提取时间。您可以将pd.factorize
用于 1、2、3、4 个类别。
import pandas as pd
df = pd.DataFrame(
'2021-07-15 00:00:00 0.48',
'2021-07-15 06:00:00 80.00',
'2021-07-15 12:00:00 6.10',
'2021-07-15 18:00:00 1400.00',
'2021-07-16 00:00:00 1400.00'
, columns=['value'])
df
# value
# 0 2021-07-15 00:00:00 0.48
# 1 2021-07-15 06:00:00 80.00
# 2 2021-07-15 12:00:00 6.10
# 3 2021-07-16 00:00:00 1400.00
# 4 2021-07-15 18:00:00 1400.00
df['date'] = pd.to_datetime(df['value'].str[:19])
df.sort_values(['date'], ascending=[True], inplace=True)
df['time'] = df['date'].dt.time
df['index'], _ = pd.factorize(df['time'])
df['index'] += 1
df
# value date time index
# 0 2021-07-15 00:00:00 0.48 2021-07-15 00:00:00 00:00:00 1
# 1 2021-07-15 06:00:00 80.00 2021-07-15 06:00:00 06:00:00 2
# 2 2021-07-15 12:00:00 6.10 2021-07-15 12:00:00 12:00:00 3
# 4 2021-07-15 18:00:00 1400.00 2021-07-15 18:00:00 18:00:00 4
# 3 2021-07-16 00:00:00 1400.00 2021-07-16 00:00:00 00:00:00 1
【讨论】:
您好,感谢您的回答。但是我想要那个编号列,只要它是 00:00:00 时间它总是说 1,每当它是 06:00:00 时间它总是说 2,每当它是 12:00:00 时间它总是说 3,只要它是 18 :00:00 时间总是说 4。这样,我将有一个只有 1,2,3,4 值的分类列 @RavikantPandey 我更新了。请确认。以上是关于如何在 Pandas 中添加一个按时间间隔编号的新分类列的主要内容,如果未能解决你的问题,请参考以下文章
使用 pandas 的 datetimeindex 在特定日期按分钟和小时提取时间间隔
Python - 按时间间隔分组的时间加权平均 Pandas
PANDAS 中类似 SQL 的窗口函数:Python Pandas Dataframe 中的行编号