熊猫时间序列:从中午到中午的分组和总和

时间:2016-10-15 18:21:14

标签: python-2.7 pandas

我的pandas数据框的结构如下(' date' as index):

           starttime  duration_seconds
date                                  
2012-12-24  11:52:00             31800
2012-12-23   0:28:00             35940
2012-12-22   2:00:00             26820
2012-12-21   1:57:00             23520
2012-12-20   1:32:00             23100
2012-12-19   0:50:00             25080
2012-12-18   1:17:00             24780
2012-12-17   0:38:00             25440
2012-12-15  10:38:00             32760
2012-12-14   0:35:00             23160
2012-12-12  22:54:00              3960
2012-12-12   0:21:00             24060
2012-12-10  23:45:00               900
2012-12-11  11:00:00             24840
2012-12-10   0:27:00             25980
2012-12-09  19:29:00              4320
2012-12-09   3:00:00             29880
2012-12-08   2:07:00             34380

我使用以下内容来分组日期并总结每天的总秒数:

df_sum = df.groupby(df.index.date).sum()

我想做的是在第二天的中午到第二天的正午加上duration_seconds。有这种优雅(熊猫)的方式吗?提前谢谢!

1 个答案:

答案 0 :(得分:3)

pd.TimeGrouper是一个自定义groupby类,用于对DatetimeIndexTimedeltaIndexPeriodIndex的NDFrame进行时间间隔分组。 (如果您的数据框索引使用日期字符串,则需要先使用df.index = pd.DatetimeIndex(df.index)将其转换为DatetimeIndex。)

df.groupby(pd.TimeGrouper('24H')).sum()个小组df使用从时间00:00:00开始的24小时间隔。

df.groupby(pd.TimeGrouper('24H'), base=12).sum()开始,每隔24小时

df个小组12:00:00

In [90]: df.groupby(pd.TimeGrouper('24H', base=12)).sum()
Out[90]: 
                     duration_seconds
2012-12-07 12:00:00           34380.0
2012-12-08 12:00:00           34200.0
2012-12-09 12:00:00           26880.0
2012-12-10 12:00:00           24840.0
2012-12-11 12:00:00           28020.0
2012-12-12 12:00:00               NaN
2012-12-13 12:00:00           23160.0
2012-12-14 12:00:00           32760.0
2012-12-15 12:00:00               NaN
2012-12-16 12:00:00           25440.0
2012-12-17 12:00:00           24780.0
2012-12-18 12:00:00           25080.0
2012-12-19 12:00:00           23100.0
2012-12-20 12:00:00           23520.0
2012-12-21 12:00:00           26820.0
2012-12-22 12:00:00           35940.0
2012-12-23 12:00:00           31800.0

pd.TimeGrouper上的文档有点稀疏。它是pd.Grouper的子类,因此其许多参数与pd.Grouper中记录的参数具有相同的含义。您可以在Cookbook中找到更多pd.TimeGrouper用法示例。我通过检查the source code找到了base参数。 base中的pd.TimeGrouper参数与pd.resample中的base参数具有相同的含义,因为pd.resampleimplemented using pd.TimeGrouper,所以这并不奇怪。< / p>

事实上,想一想,计算所需结果的另一种方法是

df.resample('24H', base=12).sum()