我有一个关于许可证的数据集,其中每个许可证的发布日期和过期日期都可以查看:
数据
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]
并将发布日期和到期日期之间的日期设置为条件...
但是,我不确定如何实现这两个想法,我在网上找到的答案只是为了计算两个日期之间的天数...有人可以帮忙吗?非常感谢你!
答案 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'])