按时间间隔将熊猫数据帧数据分组

时间:2020-07-06 07:46:02

标签: python python-3.x 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

我该如何实现?我是否必须遍历数据框,还是有一个运算符可以使它更容易实现?

1 个答案:

答案 0 :(得分:0)

使用Series.dt.floor作为下限时间戳,并添加30分钟(如果尚未添加),Datetime列与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