我有一个带有DateTimeIndex的熊猫数据框和一个名为HOLIDAY的空列。
如果索引中的日期时间是放假,我想将该列的值设置为“ YES”,以便得到的数据框如下所示:
TIME HOLIDAY
2019-11-25 06:00:00 NO
2019-11-26 21:00:00 NO
2019-11-27 18:00:00 NO
2019-11-28 08:00:00 YES
2019-11-29 08:00:00 NO
2019-11-30 08:00:00 NO
我有一个日期列表:
holidays = ['2019-07-04', '2019-11-28','2019-12-25']
holidays = pd.to_datetime(holidays)
我尝试了这个,但是出现错误:
df.loc[df.index.date.isin(holidays), 'HOLIDAY'] = "YES"
实现此目标的最佳方法是什么?
谢谢
答案 0 :(得分:1)
DateTimeIndex.date返回一个numpy字符串数组,而不是pd.pd.Timestamp dtype系列。因此,必须在等式两边都获得相同的dtype:
如果TIME不在您的索引中,它将起作用:
m2 = df['TIME'].dt.date.isin(holidays.date)
或
m2 = df.index.to_series().dt.date.isin(holidays.date)
df.loc[m2, 'HOLIDAY'] = "YES"
输出:
HOLIDAY
TIME
2019-11-25 06:00:00 NO
2019-11-26 21:00:00 NO
2019-11-27 18:00:00 NO
2019-11-28 08:00:00 YES
2019-11-29 08:00:00 NO
2019-11-30 08:00:00 NO
答案 1 :(得分:1)
请注意:
holidays
包含a.o。 2019-11-28
午夜,2019-11-28
,但在 8:00 。如果要查找具有holidays
日期中的索引值的行(无论如何)
时间部分),您必须“取消”时间部分。
获取有问题的行的一种方法是使用布尔索引:
df[df.index.floor('D').isin(holidays)]
结果是:
HOLIDAY
TIME
2019-11-28 08:00:00 YES
您还只能获得HOLIDAY
列,并运行:
df[df.index.floor('D').isin(holidays)].HOLIDAY
这一次的结果( Series )是:
TIME
2019-11-28 08:00:00 YES
Name: HOLIDAY, dtype: object