You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在非日频时间序列中使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 22:10:36