如何在pandas时间序列DataFrame中创建单列标记节假日为1、非节假日为0
解决方案
报错原因
- 原生Python的
or/and逻辑运算符无法直接作用于pandas布尔序列,必须使用pandas支持的按位运算符|(或)、&(且),且每个判断条件需要用括号包裹避免优先级错误 - 你生成的
hols是按天维度的索引,而原df是小时维度的索引,索引维度不匹配直接赋值会出错 - 原有
np.where的返回值写反了:条件成立代表是节假日,你返回了0,不符合节假日标1的需求
最优实现方案(推荐)
不需要生成节假日独热编码再合并,直接判断日期是否在法定节假日列表即可,代码简洁不易出错:
# 提取所有法定节假日的日期对象 holiday_list = cal.holidays(start=first, end=last).date # 判断df每行的日期是否属于节假日,转成整数即可得到1/0标记 df['holiday'] = df.index.date.isin(holiday_list).astype(int)
原有写法修正方案
如果你要沿用现有hols独热编码的逻辑,修改后代码如下:
# 按行聚合所有节假日列,当天只要有一个节假日标记为1就返回1 hols['is_holiday'] = hols.max(axis=1) # 将天维度的节假日标记匹配到df的小时维度索引,非节假日填充0 df['holiday'] = df.index.normalize().map(hols['is_holiday']).fillna(0).astype(int)
内容的提问来源于stack exchange,提问作者bbartling
相关产品推荐
相关产品推荐

