【问题标题】:Update column based on DateTimeIndex from date range根据日期范围中的 DateTimeIndex 更新列
【发布时间】:2023-03-22 01:29:01
【问题描述】:

我有一个带有 DateTimeIndex 和一个名为 HOLIDAY 的空列的 Pandas 数据框。

如果索引中的日期时间是节假日,我想将该列的值设置为“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"

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

谢谢

【问题讨论】:

    标签: python pandas datetime


    【解决方案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
    

    这次的结果(系列)是:

    TIME
    2019-11-28 08:00:00    YES
    Name: HOLIDAY, dtype: object
    

    【讨论】:

      【解决方案2】:

      DateTimeIndex.date 返回一个 numpy 字符串数组,而不是 pd.Series 的 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-16
        • 1970-01-01
        • 1970-01-01
        • 2023-01-17
        相关资源
        最近更新 更多