【发布时间】:2021-07-24 14:49:22
【问题描述】:
我有一个 pandas 数据框,它有一个日期时间索引和四列 Phase 1、Phase 2、Phase 3 和 Sum。数据经过预处理,每 15 分钟有一行,持续数月。数据非常循环,几乎每天都在重复,但随着时间的推移变化缓慢。目标是在过去一周(或其他时间范围)的某个时间为所有天生成值的平均值。 (用于机器学习任务)
我已经设法使用以下代码计算了一天中每个时间的平均值:(这会产生一个 1 天长的数据帧)
df.groupby(df.index.hour * 60 + df.index.minute).mean()
Phase 1 Phase 2 Phase 3 Sum
Time
0 10.105782 10.235237 9.990037 30.331055
15 10.106374 10.116440 9.991424 30.214238
30 10.106517 10.086310 10.003420 30.196246
45 10.128441 10.249100 10.032895 30.410436
...
1410 10.112582 10.643766 9.971592 30.727939
1425 10.102739 10.372299 9.969986 30.445025
虽然数据是逐渐变化的,但这个总天数的平均值并不是很好。如果我可以计算这种类型的平均值会更好,但只包括上周每天的数据。
到目前为止我尝试过的是:
df
.groupby(df.index.hour * 60 + df.index.minute)
.rolling("7D", closed="left")
.mean()
它生成正确的数据,但缺少日期信息(需要保留以供将来计算)并且行的顺序错误。
Phase 1 Phase 2 Phase 3 Sum
Time
0 NaN NaN NaN NaN
0 10.064458 10.051470 10.177814 30.293742
0 10.043804 9.983143 10.062019 30.088965
0 10.020861 9.917236 10.000181 29.938278
...
0 10.224965 10.507418 10.030670 30.763053
0 10.155706 10.396408 9.919538 30.471651
0 10.149112 10.352153 9.894257 30.395522
0 10.144540 10.349998 9.902504 30.397042
15 NaN NaN NaN NaN
15 10.061673 9.967295 10.143008 30.171976
15 10.059581 10.158814 10.051835 30.270230
15 9.995112 10.024808 9.999054 30.018974
...
还有NaNs 在第一天没有完全呈现时出现的问题。是否需要先删除不完整的天数,还是可以将它们合并到平均值中?
我也试过这个:
df
.groupby([
pd.Grouper(freq="1D"),
df.index.hour * 60 + df.index.minute
])
.rolling("7D", closed="left")
.mean()
但它会生成一个仅包含 NaNs 的数据框,所以一定是出了点问题。
结果应该是这样的:
Phase 1 Phase 2 Phase 3 Sum
Time
2021-02-13 00:00:00 11.882597 12.779326 12.458625 37.120549
2021-02-13 00:15:00 11.866148 12.871785 12.509614 37.247547
2021-02-13 00:30:00 11.713676 12.730861 12.525868 36.970405
2021-02-13 00:45:00 11.742079 12.697406 12.592411 37.031897
2021-02-13 01:00:00 11.765234 12.848741 12.622687 37.236662
...
2021-05-01 10:30:00 11.842673 12.190760 12.572203 36.605636
2021-05-01 10:45:00 11.837964 12.118095 12.611271 36.567331
2021-05-01 11:00:00 11.827275 12.220564 12.588131 36.635970
在本例中,第二行包含2021-02-13 00:15:00、2021-02-12 00:15:00、...、2021-02-07 00:15:00 的平均值。我对编程并不陌生,但对 python 和 pandas 相对较新,因此非常感谢任何帮助和提示。
【问题讨论】:
标签: python pandas dataframe pandas-groupby mean