首页 > 解决方案 > 计算 Pandas 中每天重置的累积盘中指标

问题描述

我在 python 中有一个 pandas 数据框,由date_time作为 datetime 对象的 date 和 time组成的列,date作为 string 的 date 和一个 scalar measure 组成t。我想计算t每天的累积值,然后在第二天开始时将其重置为零。有没有一种简单的方法可以做到这一点?我目前正在对数据框进行分组df.groupby('date')

标签: pythonpandaspandas-groupby

解决方案


重置的累积总和相当于将其应用于组:每个新组将在开始时重置累积总和。

用一个好的最小可重现示例来说明答案总是更容易:

df = pd.DataFrame([
    ['20191224', '20191224 01:00', 50, 'Merry'], 
    ['20191224', '20191224 02:30', 50, 'Christmas'],
    ['20191225', '20191225 02:00', 50, 'Merry'],
    ['20191225', '20191225 04:25', 50, 'Christmas'],
    ['20191225', '20191225 06:50', 50, ':)']],
    columns = ['date_str', 'date_time', 'quantity', 'msg'])

确保将“date_time”列转换为实际时间戳(文档中的所有时间格式

df['date_time'] = pd.to_datetime(df['date_time'], format = "%Y%m%d %H:%M")

确保您的日期是有序的(很重要cumsum

df = df.sort_values('date_time')

您可以groupby date_str代表您的日常小组:

df.groupby('date_str').agg({
    'quantity': 'sum',
    'message': lambda x: x.join(' ')
})

            quantity                    msg
date_str        
20191224         100        Merry Christmas
20191225         150     Merry Christmas :)

就您而言,您想要的是transform cumsum

df['daily_cum_quantity'] = df.groupby('date_str')['quantity'].transform('cumsum')

导致 :

    date_str    date_time             quantity   msg        cum_quantity
0   20191224    2019-12-24 01:00:00   50         Merry      50
1   20191224    2019-12-24 02:30:00   50         Christmas  100
2   20191225    2019-12-25 02:00:00   50         Merry      50
3   20191225    2019-12-25 04:25:00   50         Christmas  100
4   20191225    2019-12-25 06:50:00   50         :)         150

推荐阅读