Python 熊猫数据框中的假日日历
我为德国创建了一个假日日历(不包括所有的日子),如下所示:Python 熊猫数据框中的假日日历,python,pandas,datetime,dataframe,calendar,Python,Pandas,Datetime,Dataframe,Calendar,我为德国创建了一个假日日历(不包括所有的日子),如下所示: from pandas.tseries.holiday import Holiday,AbstractHolidayCalendar class GermanHolidays(AbstractHolidayCalendar): rules = [Holiday('New Years Day', month=1, day=1), Holiday('First of May', month=5, day=
from pandas.tseries.holiday import Holiday,AbstractHolidayCalendar
class GermanHolidays(AbstractHolidayCalendar):
rules = [Holiday('New Years Day', month=1, day=1),
Holiday('First of May', month=5, day=1),
Holiday('German Unity Day', month=10,day=3),
...]
cal = GermanHolidays()
现在,我希望在假日出现与否时显示一列(“1”或“0”)。因此,我做了以下工作:
holidays = cal.holidays(start=X['Time (CET)'].min(), end = X['Time (CET)'].max())
X['Holidays'] = X['Time (CET)'].isin(holidays)
X['Holidays'] = X['Holidays'].astype(float)
X是一个数据帧,其中时间(CET)
列的格式为%d.%m.%Y%H:%m:%S
。不幸的是,这不起作用。没有引发任何错误,但所有列都用标记为“0”
。所以没有匹配发生,我真的不知道为什么。
我想这可能是因为假期的频率是每天的,而不是每小时一次,因为它在Time(CET)
一栏中。
如果你能帮助我,那就太好了!谢谢大家! 这可能有几个原因 其中一个。确保您的
X['Time(CET)]
列为datetime
dtype。这可以通过以下方式完成:
X['Time (CET)'] = pd.to_datetime(X['Time (CET)'], dayfirst=True, errors='coerce')
正如你所说的另一个原因是时间部分
下面是一个演示:
In [28]: df = pd.DataFrame({'Date':pd.date_range('2017-01-01 01:01:01',
freq='9H', periods=1000)})
收益率:
In [30]: df
Out[30]:
Date
0 2017-01-01 01:01:01
1 2017-01-01 10:01:01
2 2017-01-01 19:01:01
3 2017-01-02 04:01:01
4 2017-01-02 13:01:01
5 2017-01-02 22:01:01
6 2017-01-03 07:01:01
7 2017-01-03 16:01:01
8 2017-01-04 01:01:01
9 2017-01-04 10:01:01
.. ...
990 2018-01-07 07:01:01
991 2018-01-07 16:01:01
992 2018-01-08 01:01:01
993 2018-01-08 10:01:01
994 2018-01-08 19:01:01
995 2018-01-09 04:01:01
996 2018-01-09 13:01:01
997 2018-01-09 22:01:01
998 2018-01-10 07:01:01
999 2018-01-10 16:01:01
[1000 rows x 1 columns]
由于时间段不匹配,按<代码>假日进行的筛选不起作用:
In [29]: df.loc[df.Date.isin(holidays)]
Out[29]:
Empty DataFrame
Columns: [Date]
Index: []
我们可以通过规范化(截断时间部分或将时间设置为00:00:00
)我们的datetime列使其正常工作:
In [31]: df.loc[df.Date.dt.normalize().isin(holidays)]
Out[31]:
Date
0 2017-01-01 01:01:01
1 2017-01-01 10:01:01
2 2017-01-01 19:01:01
320 2017-05-01 01:01:01
321 2017-05-01 10:01:01
322 2017-05-01 19:01:01
734 2017-10-03 07:01:01
735 2017-10-03 16:01:01
这基本上就是你已经拥有的。考虑到这种方法有效而您的方法无效,这可能是因为这些值是文本,而不是@unutbu和@MaxU已经指出的时间戳 此外,您的帖子还指出: 显示假日出现与否的时间(“1”或“0”) 你真的想要一个文本值吗?您试图转换为浮点数,但可能只需要整数
X = pd.DataFrame({'Time (CET)': pd.DatetimeIndex(start='2017-01-01', end='2017-12-31', freq='12H')})
X = X.assign(Holidays=X['Time (CET)'].isin(cal.holidays()).astype(int))
>>> X
Time (CET) Holidays
0 2017-01-01 00:00:00 1
1 2017-01-01 12:00:00 0
2 2017-01-02 00:00:00 0
...
这可能是因为
X['Time(CET)]
包含日期字符串,而不是datetime64
s。X['Time(CET)].dtype的值是多少?谢谢你的评论。该列的数据类型为datetime64s。对不起,没有提及!嘿,非常感谢,这很有效。不知怎的,我遇到了一个问题,在一月份的第一天,我没有得到一个假期。我想这是因为我的数据从凌晨1:00开始。我该如何解决这个问题?@inneb,你能提供一个小的可复制数据集,让我可以复制它吗?嘿,非常感谢你的评论。已转换日期时间:)