【发布时间】:2020-10-01 23:50:56
【问题描述】:
上下文
我想创建一个时间序列(使用 pandas),如果开始日期和结束日期在考虑的日期内,则计算 Id 的不同值。
为了便于阅读,这是问题的简化版本。
数据
让我们这样定义数据:
df = pd.DataFrame({
'customerId': [
'1', '1', '1', '2', '2'
],
'id': [
'1', '2', '3', '1', '2'
],
'startDate': [
'2000-01', '2000-01', '2000-04', '2000-05', '2000-06',
],
'endDate': [
'2000-08', '2000-02', '2000-07', '2000-07', '2000-08',
],
})
这样的周期范围:
period_range = pd.period_range(start='2000-01', end='2000-07', freq='M')
目标
对于每个 customerId,有几个不同的 id。
最终目标是,对于周期范围的每个date,对于每个customerId,其start_date 和end_date 与函数my_date_predicate 匹配的不同id 的计数。
my_date_predicate的简化定义:
unset_date = pd.to_datetime("1900-01")
def my_date_predicate(date, row):
return row.startDate <= date and \
(row.endDate.equals(unset_date) or row.endDate > date)
等待结果
我想要这样的时间序列结果:
date customerId customerCount
0 2000-01 1 2
1 2000-01 2 0
2 2000-02 1 1
3 2000-02 2 0
4 2000-03 1 1
5 2000-03 2 0
6 2000-04 1 2
7 2000-04 2 0
8 2000-05 1 2
9 2000-05 2 1
10 2000-06 1 2
11 2000-06 2 2
12 2000-07 1 1
13 2000-07 2 0
问题
我如何使用 pandas 来获得这样的结果?
【问题讨论】:
-
my_date_predicate是什么聚合函数? -
刚刚添加了
my_date_predicate的定义。 -
有人可以帮忙吗?
-
您的样本数据中没有任何日期未设置的记录。你想添加一些,以便人们可以看到自己的代码运行良好吗?
-
是的,例如,我们可以将最后一个
end_date替换为unset_date作为测试(并且您的解决方案不起作用,但如果它之前被“最大日期”替换)。
标签: python pandas time-series