首页 > 解决方案 > 按时间间隔对 Pandas 数据帧数据进行分组

问题描述

我使用 Python 创建了一个 Pandas 数据框,它看起来像这样:

Rate        Qty          Datetime
130  154.270343  2020-07-05 22:10
131  267.875561  2020-07-05 22:14
132  192.785490  2020-07-05 22:15
130  192.542386  2020-07-05 22:16
150  292.374318  2020-07-05 22:17
123  170.838072  2020-07-05 22:18
144  175.755412  2020-07-05 22:29
200  181.779834  2020-07-05 22:30
201  206.707950  2020-07-05 22:31
178  154.240175  2020-07-05 22:33
191  268.368463  2020-07-05 22:40
191  192.785490  2020-07-05 22:41
201  192.542386  2020-07-05 22:43
201  292.365318  2020-07-05 22:45
300  170.838072  2020-07-05 22:50

我需要更改每条记录的日期,以便新日期需要成为下一个“间隔”。间隔可以是 30 分钟或 1 小时。如果是 30 分钟,2020-07-05 22:10则变为2020-07-05 22:30.

所以这是预期的输出:

Rate        Qty          Datetime
130  154.270343  2020-07-05 22:30
131  267.875561  2020-07-05 22:30
132  192.785490  2020-07-05 22:30
130  192.542386  2020-07-05 22:30
150  292.374318  2020-07-05 22:30
123  170.838072  2020-07-05 22:30
144  175.755412  2020-07-05 22:30
200  181.779834  2020-07-05 22:30
201  206.707950  2020-07-05 23:00
178  154.240175  2020-07-05 23:00
191  268.368463  2020-07-05 23:00
191  192.785490  2020-07-05 23:00
201  192.542386  2020-07-05 23:00
201  292.365318  2020-07-05 23:00
300  170.838072  2020-07-05 23:00

我怎样才能做到这一点?我是否必须遍历数据框,或者是否有一个操作员可以让它更容易做?

标签: pythonpython-3.xpandas

解决方案


用于Series.dt.floor地板时间戳,如果尚未Datetime列与地板值相同,则添加 30 分钟Series.where

df['Datetime'] = pd.to_datetime(df['Datetime'])
d = df['Datetime'].dt.floor('30T')

df['Datetime'] = d.where(df['Datetime'].eq(d), d + pd.Timedelta('30Min'))
print (df)
    Rate         Qty            Datetime
0    130  154.270343 2020-07-05 22:30:00
1    131  267.875561 2020-07-05 22:30:00
2    132  192.785490 2020-07-05 22:30:00
3    130  192.542386 2020-07-05 22:30:00
4    150  292.374318 2020-07-05 22:30:00
5    123  170.838072 2020-07-05 22:30:00
6    144  175.755412 2020-07-05 22:30:00
7    200  181.779834 2020-07-05 22:30:00
8    201  206.707950 2020-07-05 23:00:00
9    178  154.240175 2020-07-05 23:00:00
10   191  268.368463 2020-07-05 23:00:00
11   191  192.785490 2020-07-05 23:00:00
12   201  192.542386 2020-07-05 23:00:00
13   201  292.365318 2020-07-05 23:00:00
14   300  170.838072 2020-07-05 23:00:00

推荐阅读