根据日期范围中的DateTimeIndex更新列

时间:2019-07-16 17:54:15

标签: python pandas datetime

我有一个带有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"

实现此目标的最佳方法是什么?

谢谢

2 个答案:

答案 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 午夜
  • 您的DataFrame包含a.o。也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
相关问题