【问题标题】:Cumulative sum, refreshing at intervals, python pandas累积和,间隔刷新,python pandas
【发布时间】:2020-07-28 06:38:51
【问题描述】:
我有一些带时间戳的数据,我想运行一个扩展的总和,它会刷新,比如说每天 7:00(从零重新开始),有点像“锯齿状”总和。
我怎么能在熊猫中做到这一点?
非常感谢,
JT2
【问题讨论】:
标签:
python
pandas
dataframe
datetime
【解决方案1】:
- 最简单的情况是日期的
groupby()floor("D")。为满足您的要求,请在做地板前减去 7 小时
- 然后使用
transform("cumsum"),这样您就可以得到与原始数据帧相同基数的运行总数
- 显示了早上 6 点和早上 7 点的结果,您会看到总数正在重置
import pandas as pd
import random
df = pd.DataFrame([{'DATE':d, "value":random.randint(0,10)}
for d in pd.date_range(start=datetime(2020,7,24),end=datetime(2020,7,30), freq="15min")])
df["cumsum"] = df.groupby((df["DATE"]-pd.Timestamp(1970,1,1,7)).dt.floor("D"))["value"].transform("cumsum")
df[df["DATE"].dt.hour.isin([6,7])][:15]
输出
DATE value cumsum
2020-07-24 06:00:00 3 137
2020-07-24 06:15:00 0 137
2020-07-24 06:30:00 6 143
2020-07-24 06:45:00 7 150
2020-07-24 07:00:00 0 0
2020-07-24 07:15:00 3 3
2020-07-24 07:30:00 10 13
2020-07-24 07:45:00 5 18
2020-07-25 06:00:00 6 459
2020-07-25 06:15:00 10 469
2020-07-25 06:30:00 8 477
2020-07-25 06:45:00 8 485
2020-07-25 07:00:00 3 3
2020-07-25 07:15:00 4 7
2020-07-25 07:30:00 0 7
【解决方案2】:
假设您的 DataFrame 包含:
Dat Amount
2020-07-01 10:00 10.0
2020-07-02 06:50 3.1
2020-07-02 07:00 1.0
2020-07-02 08:10 2.1
2020-07-03 05:00 3.2
2020-07-03 10:00 12.0
2020-07-03 13:10 8.0
要执行分组和扩展总和,您可以运行:
df.groupby(pd.Grouper(key='Dat', freq='24H', base=7)).Amount.expanding().sum()
对于上述数据样本,结果为:
Dat
2020-07-01 07:00:00 0 10.0
1 13.1
2020-07-02 07:00:00 2 1.0
3 3.1
4 6.3
2020-07-03 07:00:00 5 12.0
6 20.0
Name: Amount, dtype: float64
您按 24 小时 个周期(天)执行分组,但 base 轮班
一天的开始只有 7 小时。