【问题标题】:Cumulative sum, refreshing at intervals, python pandas累积和,间隔刷新,python pandas
【发布时间】:2020-07-28 06:38:51
【问题描述】:

我有一些带时间戳的数据,我想运行一个扩展的总和,它会刷新,比如说每天 7:00(从零重新开始),有点像“锯齿状”总和。 我怎么能在熊猫中做到这一点? 非常感谢, JT2

【问题讨论】:

标签: python pandas dataframe datetime


【解决方案1】:
  1. 最简单的情况是日期的groupby()floor("D")。为满足您的要求,请在做地板前减去 7 小时
  2. 然后使用transform("cumsum"),这样您就可以得到与原始数据帧相同基数的运行总数
  3. 显示了早上 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 小时。

    【讨论】:

      猜你喜欢
      • 2018-02-28
      • 2020-03-12
      • 2013-02-12
      • 2016-07-26
      • 2017-05-16
      • 2017-01-05
      • 2019-02-15
      • 2014-07-13
      • 1970-01-01
      相关资源
      最近更新 更多