将具有句点("from"和"to"日期列)的数据帧转换为序列



我有一个带学校假期的DataFrame。他们有一个";从";以及";至";日期列。你能给我一个简洁的方法把它转换成";is_holiday";每天的系列?

我有:

idx
0 1 2

这是从最低From到最高To的所有日期范围,但您可以根据需要调整间隔:

df = pd.DataFrame({"From": ["2017-12-25", "2018-02-12", "2018-03-29"],"To": ["2018-01-05","2018-02-23","2018-04-02"],
})
df.From = pd.to_datetime(df.From)
df.To = pd.to_datetime(df.To)
holidays = []
for ix,row in df.iterrows():
holidays += pd.date_range(row.From,row.To).tolist()
all_dates = pd.DataFrame({'dates':pd.date_range(df.From.min(),df.To.max())})
all_dates['is_holiday'] = False
all_dates.loc[all_dates.dates.isin(holidays),'is_holiday'] = True

编辑,更干净的代码:

holidays = []
def holidays(x):
return pd.date_range(x.From,x.To).tolist()
holidays = df.apply(lambda x:holidays(x), axis=1).sum()
all_dates = pd.DataFrame({'dates':pd.date_range(df.From.min(),df.To.max())})
all_dates['is_holiday'] = False
all_dates.loc[all_dates.dates.isin(holidays),'is_holiday'] = True

这是我最终提出的最小的解决方案它基于@imburningabe第一个解决方案。非常感谢你的灵感!如果没有你的答案,我是做不到的

df = pd.DataFrame({"From": ["2017-12-25", "2018-02-12", "2018-03-29"],"To": ["2018-01-05","2018-02-23","2018-04-02"],
})
df.From = pd.to_datetime(df.From); df.To = pd.to_datetime(df.To)

all_dates = pd.DataFrame(index=pd.date_range(df.From.min(),df.To.max()))
all_dates['is_holiday'] = False
for (from_, to) in df.itertuples(index=False):
all_dates.loc[from_:to, 'is_holiday'] = True

最新更新