Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫-日期时间和每天重新开始的累计总和_Python_Python 3.x_Pandas - Fatal编程技术网

Python 熊猫-日期时间和每天重新开始的累计总和

Python 熊猫-日期时间和每天重新开始的累计总和,python,python-3.x,pandas,Python,Python 3.x,Pandas,假设我有这个数据帧 import pandas as pd data = {"Date_Time": ["2018-08-14 02:00:00", "2018-08-14 01:00:00", "2018-08-14 00:00:00", "2018-08-13 23:00:00", "2018-08-13 22:00:00", "2018-08-13 21:00:00", "2018-08-13 20:00:00"], "Date": ["2018-08-1

假设我有这个数据帧

    import pandas as pd
    data = {"Date_Time": ["2018-08-14 02:00:00", "2018-08-14 01:00:00", "2018-08-14 00:00:00", "2018-08-13 23:00:00", "2018-08-13 22:00:00", "2018-08-13 21:00:00", "2018-08-13 20:00:00"], 
        "Date": ["2018-08-14", "2018-08-14", "2018-08-14", "2018-08-13", "2018-08-13", "2018-08-13", "2018-08-13"], 
        "Duration":[3, 0, 0, 10, 2, 20, 1], 
        "value":[4, 3, 2, 1, 0, 23, 22],
        "Remark":["e", "o", "k", "x", "c", "z", "a"]
       }
    df = pd.DataFrame.from_dict(data)
    df

    Date_Time                 Date    Duration  value   Remark
0   2018-08-14 02:00:00     2018-08-14    3       4     e
1   2018-08-14 01:00:00     2018-08-14    0       3     o
2   2018-08-14 00:00:00     2018-08-14    0       2     k
3   2018-08-13 23:00:00     2018-08-13    10      1     x
4   2018-08-13 22:00:00     2018-08-13    2       0     c
5   2018-08-13 21:00:00     2018-08-13    20      23    z
6   2018-08-13 20:00:00     2018-08-13    1       22    a
我想做每天的累计总和。然而,我希望我的一天从每天22:00开始。因此,“值”列是指当天的小时数

或者我可以

    from datetime import timedelta
    two_hours = pd.Timedelta(hours=2)
    df["dummy_date"] = df["Date_Time"] + two_hours
    df

    Date_Time               Date    Duration    value   Remark      dummy_date
0   2018-08-14 02:00:00     2018-08-14    3     4     e         2018-08-14 04:00:00
1   2018-08-14 01:00:00     2018-08-14    0     3     o         2018-08-14 03:00:00
2   2018-08-14 00:00:00     2018-08-14    0     2     k         2018-08-14 02:00:00
3   2018-08-13 23:00:00     2018-08-13    10    1     x         2018-08-14 01:00:00
4   2018-08-13 22:00:00     2018-08-13    2     0     c         2018-08-14 00:00:00
5   2018-08-13 21:00:00     2018-08-13    20    23    z         2018-08-13 23:00:00
6   2018-08-13 20:00:00     2018-08-13    1     22    a         2018-08-13 22:00:00
如果这有助于您了解我如何计算一天,如“虚拟日期”中所示

然而,我真正想要的是,我想每天对“持续时间”列进行累积求和。因此,每天当“value”为0或在“dummy_date”列的午夜时,总和将重新开始。下面是我希望实现的期望输出

        Date_Time               Date      Duration  value   Remark  cum_sum     dummy_date       
    0   2018-08-14 02:00:00     2018-08-14     3        4         e     15  2018-08-14 04:00:00
    1   2018-08-14 01:00:00     2018-08-14     0        3         o     12  2018-08-14 03:00:00
    2   2018-08-14 00:00:00     2018-08-14     0        2         k     12  2018-08-14 02:00:00
    3   2018-08-13 23:00:00     2018-08-13    10        1         x     12  2018-08-14 01:00:00
    4   2018-08-13 22:00:00     2018-08-13     2        0         c      2  2018-08-14 00:00:00
    5   2018-08-13 21:00:00     2018-08-13    20       23         z     21  2018-08-13 23:00:00
    6   2018-08-13 20:00:00     2018-08-13     1       22         a      1  2018-08-13 22:00:00
第一行的cum_sum是从第四行开始的持续时间之和,2+10+0+0+3=15

第二行是2+10+0+0=12

第三行是2+10+0=12

第三行是2+10=12

第四行是2=2

第五行是第六行和第五行的总和,1+20=21,因为“值”是23,这被认为是另一天,或者可以从“虚拟日期”中看到

第六排是第一排

我的尝试是利用熊猫的滚动。然而,我不知道如何设置它在新的一天开始时重新开始

df["cum_sum"] = df["Duration"].rolling(24, min_periods=1).sum()
df

我认为需要通过
iloc[::-1]
groupby
通过
dates
dummy\u date
列或
Series
更改订单,包括:

如果输出中不需要
dummy\u日期

two_hours = pd.Timedelta(hours=2)
dates = (df["Date_Time"] + two_hours).dt.date
df["cum_sum"] = df["Duration"].iloc[::-1].groupby(dates).cumsum()
print (df)
            Date_Time        Date  Duration  value Remark  cum_sum
0 2018-08-14 02:00:00  2018-08-14         3      4      e       15
1 2018-08-14 01:00:00  2018-08-14         0      3      o       12
2 2018-08-14 00:00:00  2018-08-14         0      2      k       12
3 2018-08-13 23:00:00  2018-08-13        10      1      x       12
4 2018-08-13 22:00:00  2018-08-13         2      0      c        2
5 2018-08-13 21:00:00  2018-08-13        20     23      z       21
6 2018-08-13 20:00:00  2018-08-13         1     22      a        1

two_hours = pd.Timedelta(hours=2)
dates = (df["Date_Time"] + two_hours).dt.date
df["cum_sum"] = df["Duration"].iloc[::-1].groupby(dates).cumsum()
print (df)
            Date_Time        Date  Duration  value Remark  cum_sum
0 2018-08-14 02:00:00  2018-08-14         3      4      e       15
1 2018-08-14 01:00:00  2018-08-14         0      3      o       12
2 2018-08-14 00:00:00  2018-08-14         0      2      k       12
3 2018-08-13 23:00:00  2018-08-13        10      1      x       12
4 2018-08-13 22:00:00  2018-08-13         2      0      c        2
5 2018-08-13 21:00:00  2018-08-13        20     23      z       21
6 2018-08-13 20:00:00  2018-08-13         1     22      a        1
df = df.sort_values('Date_Time')
two_hours = pd.Timedelta(hours=2)
dates = (df["Date_Time"] + two_hours).dt.date
df["cum_sum"] = df["Duration"].groupby(dates).cumsum()
df = df.sort_index()
print (df)
            Date_Time        Date  Duration  value Remark  cum_sum
0 2018-08-14 02:00:00  2018-08-14         3      4      e       15
1 2018-08-14 01:00:00  2018-08-14         0      3      o       12
2 2018-08-14 00:00:00  2018-08-14         0      2      k       12
3 2018-08-13 23:00:00  2018-08-13        10      1      x       12
4 2018-08-13 22:00:00  2018-08-13         2      0      c        2
5 2018-08-13 21:00:00  2018-08-13        20     23      z       21
6 2018-08-13 20:00:00  2018-08-13         1     22      a        1