创建一个包含跨越日期范围的项目计数的Pandas数据帧

2024-09-19 23:59:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个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”,目前只有月和年的索引

^{pr2}$

我想做的是在第二个表中的每个月“montot”计算第一个表中属于时间段的项目(碰巧是按月份列出的活动列表),并将该字段添加到表中。。。例如,第1个表中的第1个项目将在第4个月计算1个,在第5个月计算一次,第2个项目将在第5个月到第9个月计数一次,每月总计记录在新的表/字段中。 所以我要一张桌子

Month    active
1/1999     5
2/1999     8

等等。。不知道怎么用熊猫/Python来接近它。。。在


Tags: 项目df列表date记录listend计数
1条回答
网友
1楼 · 发布于 2024-09-19 23:59:49

{1{date}方法中的第一个

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()

用periodidex重新索引这些数据,填写nan(以便您可以减去)并从累计结束处取累计开始,得到当前活动:

^{pr2}$

另一个可选的最后一步是创建一个数据帧(它最初跟踪更改,因此开始为正,结束为负):

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 

累计数跟踪到该点的开始和结束的运行总数:

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)

相关问题 更多 >