如何使用GroupBy.agg()从TimeSeries数据中获取“开始”和“结束”?

时间:2019-06-22 03:08:47

标签: python pandas group-by pandas-groupby

我正在尝试总结按烛台图的时间序列索引的数据帧。数据帧每隔几秒钟就有一个样本,这对于长时间显示在折线图上并不是一个好主意。

我想在X分钟前总结一下,值为[ min, mean, max, 'start', 'end' ]

我可以确定最小值,均值和最大值,但是如何获得“开始”和“结束”?

数据帧(df)可能类似于:

DateTime                Vals
2019-04-21 00:00:32     916892
2019-04-21 00:00:42     982588
2019-04-21 00:00:52     471452
2019-04-21 00:01:02     460576
2019-04-21 00:01:12     713764
2019-04-21 00:01:02     460576
...
2019-04-21 00:01:52     780545
2019-04-21 00:02:02     674151
...
2019-04-21 00:02:52     702329
2019-04-21 00:03:02     772237
...
2019-04-21 00:03:52     676713
2019-04-21 00:04:02     640359
...
2019-04-21 00:04:52     635224
2019-04-21 00:05:02     604004
....

(数据用...替换以进行精简)

到目前为止,我正在工作:

grp = df.groupby(pd.Grouper(freq='60s'))['Vals'].agg(['min', 'mean', 'max' ])

哪个给了我“期望的”输出:

DateTime             min           mean     max
2019-04-21 00:00:00  471452  790310.666667  982588
2019-04-21 00:01:00  460576  705737.500000  780545
2019-04-21 00:02:00  674151  711281.333333  772771
2019-04-21 00:03:00  653066  774984.833333  854880
2019-04-21 00:04:00  635224  655078.333333  676513

但是我还想要:

DateTime             min           mean     max     start   end
2019-04-21 00:00:00  471452  790310.666667  982588  916892  471452
2019-04-21 00:01:00  460576  705737.500000  780545  460576  780545
2019-04-21 00:02:00  674151  711281.333333  772771  674151  702329
2019-04-21 00:03:00  653066  774984.833333  854880  640359  676713
2019-04-21 00:04:00  635224  655078.333333  676513  640359  635224

有一种方便的方法吗?

1 个答案:

答案 0 :(得分:2)

为“开始”指定其他聚集"first",为“结束”指定"last"

df.groupby(pd.Grouper(freq='60s'))['Vals'].agg(
    ['min', 'mean', 'max', 'first', 'last'])
                        min           mean     max   first    last
DateTime                                                          
2019-04-21 00:00:00  471452  790310.666667  982588  916892  471452
2019-04-21 00:01:00  460576  603865.250000  780545  460576  780545
2019-04-21 00:02:00  674151  688240.000000  702329  674151  702329
2019-04-21 00:03:00  676713  724475.000000  772237  772237  676713
2019-04-21 00:04:00  635224  637791.500000  640359  640359  635224
2019-04-21 00:05:00  604004  604004.000000  604004  604004  604004

如果要重命名输出列,请指定<(desired_name,aggfunc)>:

格式的元组。
df.groupby(pd.Grouper(freq='60s'))['Vals'].agg(
     ['min', 'mean', 'max', ('start', 'first'), ('end', 'last')])

                        min           mean     max   start     end
DateTime                                                          
2019-04-21 00:00:00  471452  790310.666667  982588  916892  471452
2019-04-21 00:01:00  460576  603865.250000  780545  460576  780545
2019-04-21 00:02:00  674151  688240.000000  702329  674151  702329
2019-04-21 00:03:00  676713  724475.000000  772237  772237  676713
2019-04-21 00:04:00  635224  637791.500000  640359  640359  635224
2019-04-21 00:05:00  604004  604004.000000  604004  604004  604004