首页 > 解决方案 > 如果行在日期范围之间,则设置列值

问题描述

我有多个可以重叠的日期范围:

start_Jan, end_Jan = "2019-01-01", "2019-01-07"
start_Jan2, end_Jan2 = "2019-01-05", "2019-01-09"
start_Feb, end_Feb = "2019-02-15", "2019-02-18"

和一个以 ISO 8601 中的日期为索引的 df。

           | runs
2019-01-01 | 0
2019-01-02 | 0
...
2019-01-05 | 0
2019-01-20 | 0

对于日期范围之一之间的每一天,它应该在“运行”列中添加 1。

期望的输出:

           | runs
2019-01-01 | 1
2019-01-02 | 1
...
2019-01-05 | 2
2019-01-20 | 0

由于我有相当多的日期范围会在不规则的基础上增长,因此我可以在每次获得新的日期范围元组并重新运行计算时将日期范围元组添加到列表中。

用熊猫有什么简单的方法吗?

标签: pythonpandasdate

解决方案


使用DataFrame.loc

L = [(start_Jan,end_Jan), (start_Jan2,end_Jan2), (start_Feb, end_Feb )]
for s, e in L:
    df.loc[s:e] += 1

另一个想法是Series.add对所有元组使用 Series,通过以下方式连接在一起concat并求和:

L = [(start_Jan,end_Jan), (start_Jan2,end_Jan2), (start_Feb, end_Feb )]

s = pd.concat([pd.Series(1, index=pd.date_range(s, e)) for s, e in L], axis=1).sum(axis=1)
print (s)
2019-01-01    1.0
2019-01-02    1.0
2019-01-03    1.0
2019-01-04    1.0
2019-01-05    2.0
2019-01-06    2.0
2019-01-07    2.0
2019-01-08    1.0
2019-01-09    1.0
2019-02-15    1.0
2019-02-16    1.0
2019-02-17    1.0
2019-02-18    1.0
dtype: float64

df = df['runs'].add(s, fill_value=0)

推荐阅读