python - 如何使用 GroupBy.agg() 从 TimeSeries 数据中获取 'Start' 和 'End'?

标签 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

有方便的方法吗?

最佳答案

为“start”指定附加aggfuncs “first”,为“end”指定“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

关于python - 如何使用 GroupBy.agg() 从 TimeSeries 数据中获取 'Start' 和 'End'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56712285/

相关文章:

python - 使用未装饰的窗口启动 Tkinter

python - 如何强制清理字段并在 Django 中重新显示它?

python - 使用 pandas 过滤和计数组

python - 如何在 Python 中使用 urllib3 查看 HTTP header 、响应代码和 html 内容?

python - 为什么我的文本文件不断覆盖其中的数据?

python Pandas : detecting existence of timestamp in Series

python - 基于字典在数据框中搜索字符串

sql - 如何找到拥有最活跃卖家(每个用户每天软件销售量最高)的团队?

php - 如何从 MAX 和组设置变量?

pandas - 如何在一次遍历行中将多列聚合为集合