如何在 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 中的行编号

如何检查它是不是是python中的新一天?

按 10 分钟间隔对 pandas DataFrame 进行分组[重复]

更快地在新列 pandas 中添加未来间隔