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