微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 创建一个Pandas数据框,其中包含跨越日期范围的项目数

我有一个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

我按月创建了一个Period索引表“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来处理它…

解决方法:

这是一种方法,首先是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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐