根据熊猫的其他间隔标记间隔

时间:2019-03-01 13:30:49

标签: python pandas datetime

我有两个数据帧,ab

b具有日期时间索引,而a具有StartEnd日期时间列 我需要“标记”到True,所有b的行的索引都位于[Start,End]的任何a间隔之内

现在我正在做

for _,r in a.iterrows():
    b.loc[np.logical_and(b.index>=r.Start,
                                    b.index<=r.End),'Label']=True

但是当b大时,这非常慢。

如何优化提供的代码段?

MVCE:

b=pd.DataFrame(index=[pd.Timestamp('2017-01-01'),pd.Timestamp('2018-01-01')],columns=['Label'])

  a=pd.DataFrame.from_dict([{'Start':pd.Timestamp('2018-01-01'),'End':pd.Timestamp('2020-01-01')}])

编辑:

解决方案位于  Add/fill pandas column based on range in rows from another dataframe 对我不起作用(在我们处理日期时间时,它们使用范围来填充时间间隔

2 个答案:

答案 0 :(得分:1)

这是使用apply-

的一种解决方案

虚拟CSV数据

Date,Start,End
01-08-2019,01-02-2019, 01-10-2019
01-08-2019,01-02-2020, 01-10-2020

代码

df = pd.read_csv('dummy.csv').apply(pd.to_datetime)
df.T.apply(lambda x: x[1] < x[0] and x[2] > x[0])

结果

0     True
1    False
dtype: bool

答案 1 :(得分:1)

如何做这样的事情?

def func(): # b.index
    mask = (a['Start'] > date) & (a['End'] <= date)
    df = a.loc[mask]
    if len(df) > 0:
        return True
    else:
        return False

b['Label'] = b.index().to_series().apply(func)