计算两个日期时间之间的观察次数

时间:2019-03-24 15:23:32

标签: python

我有一个关于许可证的数据集,其中每个许可证的发布日期和过期日期都可以查看:

数据

License ID    Issue Date      Expiration Date    
1             2008-04-02      2008-07-10
2             2008-06-03      2008-09-12
3             2008-07-14      2008-10-21
4             2008-08-15      2008-11-12

然后,我想在特定的日子计算有效许可证的数量。

输出

Day              Number of Active Licenses
2008-04-01       0
2008-04-02       1
2008-04-03       1
...
2008-06-03       2
...
2008-07-11       1
...
2008-07-15       2

我已经有了一份要计算许可证号的天数列表。格式如下:

activeDay = [2008-04-01, 2008-04-02, ..., 2008-12-31]

我认为可能会有一个循环:

day中的每个activeDay,为每个观察值生成一个列(许可证ID),如果此1位于{之间,则其等于day {1}}和Issue Date,如果Expiration Date在间隔0之外,则等于day。然后,我们可以汇总此列中的数字并获得有效许可证的数量。

可能存在一种更简单的方法来使用功能[Issue Date, Expiration Date]并将发布日期和到期日期之间的日期设置为条件...

但是,我不确定如何实现这两个想法,我在网上找到的答案只是为了计算两个日期之间的天数...有人可以帮忙吗?非常感谢你!

1 个答案:

答案 0 :(得分:1)

您可以使用mask查找所需记录

import datetime

df = pd.DataFrame([['1','2008-04-02','2008-07-10']], 
  columns=['license', 'issue', 'expire'])

parse_date = lambda x: return datetime.datetime.strptime(x, '%Y-%m-%d')

dt = parse_date('2008-06-01')

date_between = lambda x: parse_date(x['issue']) > dt and parse_date('expire') < dt

df = df[df.apply(date_between)]

因此,您可以使用列表来存储结果:

s = []
for ds in active_day:
    dt = parse_date(ds)
    n = df[df.apply(date_between)].license.count()
    s.append((dt, n))

result_df = df.DataFrame(s, columns=['active_day', 'count'])