我有一个带有日期列的pandas数据框,我正在尝试添加一个新的布尔值列,指示给定日期是否为假日。
以下是代码,但它不起作用(所有值都是False)因为类型似乎不同,我无法弄清楚如何在pandas数据框中获取'date'是与假期相同的类型:
cal = USFederalHolidayCalendar()
holidays = cal.holidays(start=train_df['date'].min(),
end=train_df['date'].max()).to_pydatetime()
train_df['holiday'] = train_df['date'].isin(holidays)
print type(train_df['date'][1])
print type(holidays[0])
答案 0 :(得分:24)
你不需要转换任何东西。只是直接比较。 pandas
非常聪明,可以比较日期和时间方面的许多不同类型。如果您在日期/时间兼容性方面遇到问题,则必须采用稍微深奥的格式。
import pandas as pd
from pandas.tseries.holiday import USFederalHolidayCalendar as calendar
dr = pd.date_range(start='2015-07-01', end='2015-07-31')
df = pd.DataFrame()
df['Date'] = dr
cal = calendar()
holidays = cal.holidays(start=dr.min(), end=dr.max())
df['Holiday'] = df['Date'].isin(holidays)
print df
结果:
Date Holiday
0 2015-07-01 False
1 2015-07-02 False
2 2015-07-03 True
3 2015-07-04 False
4 2015-07-05 False
5 2015-07-06 False
6 2015-07-07 False
7 2015-07-08 False
8 2015-07-09 False
9 2015-07-10 False
10 2015-07-11 False
11 2015-07-12 False
12 2015-07-13 False
13 2015-07-14 False
14 2015-07-15 False
15 2015-07-16 False
16 2015-07-17 False
17 2015-07-18 False
18 2015-07-19 False
19 2015-07-20 False
20 2015-07-21 False
21 2015-07-22 False
22 2015-07-23 False
23 2015-07-24 False
24 2015-07-25 False
25 2015-07-26 False
26 2015-07-27 False
27 2015-07-28 False
28 2015-07-29 False
29 2015-07-30 False
30 2015-07-31 False
请注意,2015年7月4日是星期六。
答案 1 :(得分:2)
我遇到了与作者相同的问题,并且提供的其他修复程序对我不起作用。这就是工作:
train_df['holiday'] = train_df['date'].dt.date.astype('datetime64').isin(holidays)