我有一个DF有两个感兴趣的日期,看起来有点像:
LIST_DATE END_DATE
2000-04-18 2000-05-17 00:00:00
2000-05-18 2000-09-18 00:00:00
2000-04-18 2001-06-07 00:00:00
我按月创建了一个期间索引表“montot”,目前只有月份和年份索引
<class 'pandas.tseries.period.PeriodIndex'>
freq: M
[1999-01, ..., 2013-07]
我想要做的是在第二个表中的每个月“montot”计算第一个表中属于时间段的项目(恰好是按月活动列表)并将该字段添加到表中。 ..所以例如第一个表中的第一个项目将在第4个月计算1个,在第5个月计算一次,而第二个项目在第5个月到第9个月等计算一次。每月总计记录在新的表/场。 所以我会有一张桌子
Month active
1/1999 5
2/1999 8
等。还没有弄清楚如何使用Pandas / Python接近它......
答案 0 :(得分:6)
以下是一种方法,首先value_counts
每个日期列中的期间(使用to_period
时间戳方法):
In [11]: p = pd.PeriodIndex(freq='m', start='2000-1', periods=18)
In [12]: starts = df['LIST_DATE'].apply(lambda t: t.to_period(freq='m')).value_counts()
In [13]: ends = df['END_DATE'].apply(lambda t: t.to_period(freq='m')).value_counts()
通过PeriodIndex对这些进行重新索引,填写NaN(以便您可以减去)并从累计结束开始累计,以便为您提供当前有效的:
In [14]: starts.reindex(p).fillna(0).cumsum() - ends.reindex(p).fillna(0).cumsum()
Out[14]:
2000-01 0
2000-02 0
2000-03 0
2000-04 2
2000-05 2
2000-06 2
2000-07 2
2000-08 2
2000-09 1
2000-10 1
2000-11 1
2000-12 1
2001-01 1
2001-02 1
2001-03 1
2001-04 1
2001-05 1
2001-06 0
Freq: M, dtype: float64
另一个最后一步是创建一个DataFrame(最初跟踪更改,因此开始是正数并且结束为负):
In [21]: current = pd.DataFrame({'starts': starts, 'ends': -ends}, p)
In [22]: current
Out[22]:
ends starts
2000-01 NaN NaN
2000-02 NaN NaN
2000-03 NaN NaN
2000-04 NaN 2
2000-05 -1 1
2000-06 NaN NaN
2000-07 NaN NaN
2000-08 NaN NaN
2000-09 -1 NaN
2000-10 NaN NaN
2000-11 NaN NaN
2000-12 NaN NaN
2001-01 NaN NaN
2001-02 NaN NaN
2001-03 NaN NaN
2001-04 NaN NaN
2001-05 NaN NaN
2001-06 -1 NaN
In [23]: current.fillna(0)
Out[23]:
ends starts
2000-01 0 0
2000-02 0 0
2000-03 0 0
2000-04 0 2
2000-05 -1 1
2000-06 0 0
2000-07 0 0
2000-08 0 0
2000-09 -1 0
2000-10 0 0
2000-11 0 0
2000-12 0 0
2001-01 0 0
2001-02 0 0
2001-03 0 0
2001-04 0 0
2001-05 0 0
2001-06 -1 0
cumsum跟踪开始的运行总数并结束到该点:
In [24]: current.fillna(0).cumsum()
Out[24]:
ends starts
2000-01 0 0
2000-02 0 0
2000-03 0 0
2000-04 0 2
2000-05 -1 3
2000-06 -1 3
2000-07 -1 3
2000-08 -1 3
2000-09 -2 3
2000-10 -2 3
2000-11 -2 3
2000-12 -2 3
2001-01 -2 3
2001-02 -2 3
2001-03 -2 3
2001-04 -2 3
2001-05 -2 3
2001-06 -3 3
将这些列汇总在一起,给出那些当前有效的列,并且结果如上所述:
In [25]: current.fillna(0).cumsum().sum(1)