给定具有Timedelta
索引的布尔数组,如何在现有True
的某些Timedelta
内制作任何样本,也True
?
另一种思考方式可能是:如何通过给定Timedelta
"增长"布尔数组的True
区域。
我目前的实现在下面工作正常,但很慢。
df["valid_region_extended"] = df.valid_region.copy()
extension_period = pd.Timedelta(seconds=0.01)
for index in df.valid_region.index:
window_start = index - extension_period
window_end = index + extension_period
if df.valid_region[window_start:window_end].any():
df.valid_region_extended[index] = True
假设索引是均匀分布的,你可以shift()
布尔数组的两个方向并sum()
它们:
df = pd.DataFrame({'valid': [False]*3+[True]+[False]*7+[True]*2+[False]*6+[True]}, index=pd.date_range('2021-01-01', '2021-01-20'))
pad = 2 # derive from Timedelta
df = df.assign(**{f'valid{n}': df.valid.shift(n) for n in range(-pad, pad+1)})
df['final'] = df.sum(axis=1).astype(bool)
原始与扩展:
valid final
2021-01-01 False False
2021-01-02 False True
2021-01-03 False True
2021-01-04 True True
2021-01-05 False True
2021-01-06 False True
2021-01-07 False False
2021-01-08 False False
2021-01-09 False False
2021-01-10 False True
2021-01-11 False True
2021-01-12 True True
2021-01-13 True True
2021-01-14 False True
2021-01-15 False True
2021-01-16 False False
2021-01-17 False False
2021-01-18 False True
2021-01-19 False True
2021-01-20 True True