如何在非日频时间序列中使用pandas.tseries.holiday标记节假日?
为小时级DataFrame标记全天美国节假日
现有方法可用于日频数据标记美国节假日,但处理小时级这类非日频数据时,仅会将节假日当天的0点标记为True,其余小时均为False。我们需要实现将节假日当天所有小时都标记为节假日的效果。
原代码及问题
import pandas as pd from pandas.tseries.holiday import USFederalHolidayCalendar as calendar df = pd.DataFrame(index=pd.date_range(start='2001-07-03 22:00', end='2001-07-04 02:00', freq='1h')) holidays = calendar().holidays(start=df.index[0], end=df.index[-1]) df['holiday'] = df.index.isin(holidays) df
当前输出
holiday 2001-07-03 22:00:00 False 2001-07-03 23:00:00 False 2001-07-04 00:00:00 True 2001-07-04 01:00:00 False 2001-07-04 02:00:00 False
期望输出
holiday 2001-07-03 22:00:00 False 2001-07-03 23:00:00 False 2001-07-04 00:00:00 True 2001-07-04 01:00:00 True 2001-07-04 02:00:00 True
解决方案
核心思路是忽略时间戳中的小时部分,只比较日期是否属于节假日。以下两种方法均可实现目标:
方法1:归一化时间戳到当天0点
通过normalize()方法将所有时间戳转换为当天0点,再判断是否在节假日列表中:
import pandas as pd from pandas.tseries.holiday import USFederalHolidayCalendar as calendar df = pd.DataFrame(index=pd.date_range(start='2001-07-03 22:00', end='2001-07-04 02:00', freq='1h')) holidays = calendar().holidays(start=df.index[0], end=df.index[-1]) # 将索引归一化到当天0点,再匹配节假日 df['holiday'] = df.index.normalize().isin(holidays) print(df)
方法2:直接提取日期对象匹配
提取时间戳的日期部分与节假日的日期部分直接匹配:
df['holiday'] = df.index.date.isin(holidays.date)
以上两种方法都会将节假日当天的所有小时统一标记为True,完全符合期望输出。
内容的提问来源于stack exchange,提问作者Grzegorz Lippe
相关产品推荐
相关产品推荐

