这是一种实现方法,首先
value_counts是每个日期列中的 句点
(使用
to_periodTimestamp方法):
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 02000-02 02000-03 02000-04 22000-05 22000-06 22000-07 22000-08 22000-09 12000-10 12000-11 12000-12 12001-01 12001-02 12001-03 12001-04 12001-05 12001-06 0Freq: M, dtype: float64
最后一个替代步骤是创建一个Dataframe(最初跟踪更改,因此开始为正,结束为负):
In [21]: current = pd.Dataframe({'starts': starts, 'ends': -ends}, p)In [22]: currentOut[22]: ends starts2000-01 NaN NaN2000-02 NaN NaN2000-03 NaN NaN2000-04 NaN 22000-05 -1 12000-06 NaN NaN2000-07 NaN NaN2000-08 NaN NaN2000-09 -1 NaN2000-10 NaN NaN2000-11 NaN NaN2000-12 NaN NaN2001-01 NaN NaN2001-02 NaN NaN2001-03 NaN NaN2001-04 NaN NaN2001-05 NaN NaN2001-06 -1 NaNIn [23]: current.fillna(0)Out[23]: ends starts2000-01 0 02000-02 0 02000-03 0 02000-04 0 22000-05 -1 12000-06 0 02000-07 0 02000-08 0 02000-09 -1 02000-10 0 02000-11 0 02000-12 0 02001-01 0 02001-02 0 02001-03 0 02001-04 0 02001-05 0 02001-06 -1 0累计跟踪开始和结束时的运行总计:
In [24]: current.fillna(0).cumsum()Out[24]: ends starts2000-01 0 02000-02 0 02000-03 0 02000-04 0 22000-05 -1 32000-06 -1 32000-07 -1 32000-08 -1 32000-09 -2 32000-10 -2 32000-11 -2 32000-12 -2 32001-01 -2 32001-02 -2 32001-03 -2 32001-04 -2 32001-05 -2 32001-06 -3 3
将这些列加在一起,得出当前处于活动状态的列,结果与上面相同:
In [25]: current.fillna(0).cumsum().sum(1)



