我有一个 Pandas 数据框如下:
ID Start End
1 2013-03-03 2013-04-05
2 2013-03-03 2013-04-05
3 2012-03-02 2012-05-05
4 2013-03-01 2013-04-04
5 2013-02-25 2013-06-05
6 2012-02-26 2012-05-05
7 2013-02-25 2013-04-27
8 2012-02-26 2012-03-01
9 2013-03-22 2013-03-25
10 2013-06-27 2013-07-01
有没有办法汇总每个月发生的天数:每个 ID 的每个间隔的年份。
我试图得到的输出是每个月所有天数的总和:每个 ID 贡献的年份。
因此,ID1 将持续 29 天到 2013 年 3 月和 5 天到 2013 年 4 月; ID3 将贡献 30 天到 2012 年 3 月、30 天到 2012 年 4 月和 5 天到 2012 年 5 月。
等等....
如果您能提供帮助,请提前致谢。
最佳答案
这是一个可怕的方法:
In [11]: df1.apply(lambda x: pd.Series(1, pd.date_range(x.loc['Start'], x.loc['End'] - pd.offsets.Day(1), freq='D')).resample('M', how='sum'), axis=1).fillna(0)
Out[11]:
2012-02-29 2012-03-31 2012-04-30 2012-05-31 2013-02-28 2013-03-31 2013-04-30 2013-05-31 2013-06-30
ID
1 0 0 0 0 0 29 4 0 0
2 0 0 0 0 0 29 4 0 0
3 0 30 30 4 0 0 0 0 0
4 0 0 0 0 0 31 3 0 0
5 0 0 0 0 4 31 30 31 4
6 4 31 30 4 0 0 0 0 0
7 0 0 0 0 4 31 26 0 0
8 4 0 0 0 0 0 0 0 0
9 0 0 0 0 0 3 0 0 0
10 0 0 0 0 0 0 0 0 4
分解一下,对于每一行,我们通过为开始和结束之间的每一天创建一系列 1 来计算每个月的天数,然后使用 resample 为每个月总结它们:
In [12]: x = df1.iloc[0]
In [13]: x
Out[13]:
Start 2013-03-03 00:00:00
End 2013-04-05 00:00:00
Name: 1, dtype: datetime64[ns]
In [14]: pd.Series(1, pd.date_range(x['Start'], x['End'] - pd.offsets.Day(1), freq='D')).resample('M', how='sum')
Out[14]:
2013-03-31 29
2013-04-30 4
Freq: M, dtype: int64
关于python - 间隔天数的总和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20087042/