如何使用Python Pandas有效地基于日期重叠范围对行进行子集化?

3

我的数据框中有两个日期类型的列:开始时间和结束时间(yyyy-mm-dd)。

这是我的数据框:

import pandas as pd
import datetime 

data=[["2016-10-17","2017-03-08"],["2014-08-17","2016-09-08"],["2014-01-01","2015-01-01"],["2017-12-20","2019-01-01"]]

df=pd.DataFrame(data,columns=['start','end'])
df['start'] =  pd.to_datetime(df['start'], format='%Y-%m-%d')
df['end'] =  pd.to_datetime(df['end'], format='%Y-%m-%d')

       start        end
0 2016-10-17 2017-03-08
1 2014-08-17 2016-09-08
2 2014-01-01 2015-01-01
3 2017-12-20 2019-01-01

我有以下参考开始日期和结束日期。

ref_start=datetime.date(2015, 9, 20)
ref_end=datetime.date(2017,1,31)
print(ref_start,ref_end)
2015-09-20 2017-01-31

如果一行的开始和结束日期范围与参考开始和结束日期重叠,则我想要对该行进行子集操作。由于开始和结束日期范围与参考日期范围(2015-09-20 ~ 2017-01-31)不重叠,因此第三行和第四行未被选择。

因此,我希望得到以下结果:

        start         end
0  2016-10-17  2017-03-08
1  2014-08-17  2016-09-08

为了实现这个目标,我考虑使用以下代码,基于这个参考链接:Python中高效的日期范围重叠计算?
df[(max(df['start'],ref_start)>min(df['end'],ref_end))]

然而,它并不起作用。有没有更有效的方式来获得所需的结果?

1个回答

2
我职业生涯早期学到的一个技巧是我称之为“交叉日期”:您将一个范围的开始与另一个范围的结束进行比较。
# pd.Timestamp can do everything that datetime/date does and some more
ref_start = pd.Timestamp(2015, 9, 20)
ref_end = pd.Timestamp(2017,1,31)

# Compare the start of one range to the end of another and vice-versa
# Made into a separate variable for reability
cond = (ref_start <= df['end']) & (ref_end >= df['start'])
df[cond]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接