每个组的总滚动日历天数 Python Pandas
Total Rolling Calendar Days per Group Python Pandas
我想计算 所有日历日 的滚动累计总数 "station" 正在运行。我的数据集不包含该站未运行的日期。但是我需要计算每个站从开始日期开始运行的日历天数的滚动总数。
我在下面提供了创建包含不同站点及其运行日期的数据框的代码。我计算滚动累计工作天数,现在我需要找到自开始日期以来的日历天数的滚动累计
import pandas as pd
import numpy as np
d = {'Date': ['2011-01-02','2011-01-04','2011-01-05',
'2011-01-10','2011-01-14','2011-01-15',
'2011-01-17','2011-01-19','2011-01-22'],
'Value': [2,4,66,22,1,2,4,7,9],
'Station_ID': ['A','A','A','A','B','B','B','B','B']}
df = pd.DataFrame(data=d)
df['Date'] = df['Date'].values.astype('datetime64[D]')
df
# this gives each stations rolling cumulative number of operating days
df['Rolling_Operating_Days'] = df.groupby('Station_ID')['Date'].rank(method='dense',ascending=True)
df
我希望输出如下所示:
如您所见,"rolling calendar_days" 从 "station_ID" 的日历日 1 开始,然后累计滚动总数。
所以,看看下面的数据集,即使该站只运行了 4 或 5 天 ("Rolling_Operating_Days"),总的 ("Rolling_Calendar_Days") 个日历日是 9.
Date Value Station_ID Rolling_Operating_Days Rolling_Calendar_Days
0 2011-01-02 2 A 1.0 1.0
1 2011-01-04 4 A 2.0 3.0
2 2011-01-05 66 A 3.0 4.0
3 2011-01-10 22 A 4.0 9.0
4 2011-01-14 1 B 1.0 1.0
5 2011-01-15 2 B 2.0 2.0
6 2011-01-17 4 B 3.0 4.0
7 2011-01-19 7 B 4.0 6.0
8 2011-01-22 9 B 5.0 9.0
我希望能够计算 "Rolling_Calendar_Days" 列。有人知道怎么做吗?
我想我理解你想要完成的事情。您的示例的问题在于,如果开始日期不是 1 (2011-01-02)。然后它将从 2 而不是 1 开始。解决方案是使用 pd.series.diff()
然后 cumsum
假设 df_subset 是:
Date Value Station_ID
1 2011-01-02 0.961571 A
3 2011-01-04 -0.927761 A
4 2011-01-05 0.340300 A
9 2011-01-10 -1.805910 A
13 2011-01-14 0.062959 B
14 2011-01-15 -0.402931 B
16 2011-01-17 0.696784 B
18 2011-01-19 -0.039989 B
21 2011-01-22 -0.547465 B
那么你可以:
# create a func for groupby
def myFunc(x):
return x['Date'].diff().dt.days.replace(np.nan,1).cumsum()
# apply function to group and reset index
df_subset['Rolling_Calendar_Days'] = df_subset.groupby('Station_ID').apply(myFunc).reset_index(level=0, drop=True)
Date Value Station_ID Rolling_Calendar_Days
1 2011-01-02 0.961571 A 1.0
3 2011-01-04 -0.927761 A 3.0
4 2011-01-05 0.340300 A 4.0
9 2011-01-10 -1.805910 A 9.0
13 2011-01-14 0.062959 B 1.0
14 2011-01-15 -0.402931 B 2.0
16 2011-01-17 0.696784 B 4.0
18 2011-01-19 -0.039989 B 6.0
21 2011-01-22 -0.547465 B 9.0
这假设您希望开始日期从 1 而不是 0 开始
我想计算 所有日历日 的滚动累计总数 "station" 正在运行。我的数据集不包含该站未运行的日期。但是我需要计算每个站从开始日期开始运行的日历天数的滚动总数。
我在下面提供了创建包含不同站点及其运行日期的数据框的代码。我计算滚动累计工作天数,现在我需要找到自开始日期以来的日历天数的滚动累计
import pandas as pd
import numpy as np
d = {'Date': ['2011-01-02','2011-01-04','2011-01-05',
'2011-01-10','2011-01-14','2011-01-15',
'2011-01-17','2011-01-19','2011-01-22'],
'Value': [2,4,66,22,1,2,4,7,9],
'Station_ID': ['A','A','A','A','B','B','B','B','B']}
df = pd.DataFrame(data=d)
df['Date'] = df['Date'].values.astype('datetime64[D]')
df
# this gives each stations rolling cumulative number of operating days
df['Rolling_Operating_Days'] = df.groupby('Station_ID')['Date'].rank(method='dense',ascending=True)
df
我希望输出如下所示:
如您所见,"rolling calendar_days" 从 "station_ID" 的日历日 1 开始,然后累计滚动总数。
所以,看看下面的数据集,即使该站只运行了 4 或 5 天 ("Rolling_Operating_Days"),总的 ("Rolling_Calendar_Days") 个日历日是 9.
Date Value Station_ID Rolling_Operating_Days Rolling_Calendar_Days
0 2011-01-02 2 A 1.0 1.0
1 2011-01-04 4 A 2.0 3.0
2 2011-01-05 66 A 3.0 4.0
3 2011-01-10 22 A 4.0 9.0
4 2011-01-14 1 B 1.0 1.0
5 2011-01-15 2 B 2.0 2.0
6 2011-01-17 4 B 3.0 4.0
7 2011-01-19 7 B 4.0 6.0
8 2011-01-22 9 B 5.0 9.0
我希望能够计算 "Rolling_Calendar_Days" 列。有人知道怎么做吗?
我想我理解你想要完成的事情。您的示例的问题在于,如果开始日期不是 1 (2011-01-02)。然后它将从 2 而不是 1 开始。解决方案是使用 pd.series.diff()
然后 cumsum
假设 df_subset 是:
Date Value Station_ID
1 2011-01-02 0.961571 A
3 2011-01-04 -0.927761 A
4 2011-01-05 0.340300 A
9 2011-01-10 -1.805910 A
13 2011-01-14 0.062959 B
14 2011-01-15 -0.402931 B
16 2011-01-17 0.696784 B
18 2011-01-19 -0.039989 B
21 2011-01-22 -0.547465 B
那么你可以:
# create a func for groupby
def myFunc(x):
return x['Date'].diff().dt.days.replace(np.nan,1).cumsum()
# apply function to group and reset index
df_subset['Rolling_Calendar_Days'] = df_subset.groupby('Station_ID').apply(myFunc).reset_index(level=0, drop=True)
Date Value Station_ID Rolling_Calendar_Days
1 2011-01-02 0.961571 A 1.0
3 2011-01-04 -0.927761 A 3.0
4 2011-01-05 0.340300 A 4.0
9 2011-01-10 -1.805910 A 9.0
13 2011-01-14 0.062959 B 1.0
14 2011-01-15 -0.402931 B 2.0
16 2011-01-17 0.696784 B 4.0
18 2011-01-19 -0.039989 B 6.0
21 2011-01-22 -0.547465 B 9.0
这假设您希望开始日期从 1 而不是 0 开始