4

次のような 2 つの関心のある日付を持つ 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]

私がやりたいことは、2番目のテーブル「モントット」の月ごとに、期間内にある最初のテーブルのアイテムをカウントし(月ごとにアクティブなリストになる可能性があります)、そのフィールドをテーブルに追加することです...だからたとえば、1 番目のテーブルの 1 番目の項目は 4 か月目に 1 回、5 か月に 1 回カウントされ、2 番目の項目は 5 か月目から 9 か月目に 1 回カウントされるなど、月ごとの合計が新しいテーブル/フィールドに記録されます。 . だから私はテーブルを用意します

Month    active
1/1999     5
2/1999     8

など.. Pandas/Pythonでそれにアプローチする方法の手がかりがありません...

4

1 に答える 1

7

これを行う 1 つの方法を次に示します。最初に、各日付列のvalue_counts期間to_period( Timestamp メソッドを使用して) 取得します。

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)
于 2013-09-12T22:45:07.163 に答える