【问题标题】:Get weekday/day-of-week for Datetime column of DataFrame获取 DataFrame 的 Datetime 列的工作日/星期几
【发布时间】:2015-03-16 13:23:15
【问题描述】:

我有一个 DataFrame df,如下所示(摘录,'Timestamp' 是索引):

Timestamp              Value
2012-06-01 00:00:00     100
2012-06-01 00:15:00     150
2012-06-01 00:30:00     120
2012-06-01 01:00:00     220
2012-06-01 01:15:00      80
...and so on.

我需要一个新列 df['weekday'],其中包含时间戳的相应工作日/星期几。

我怎样才能得到这个?

【问题讨论】:

    标签: python pandas dataframe datetime dayofweek


    【解决方案1】:

    使用新的dt.dayofweek 属性:

    In [2]:
    
    df['weekday'] = df['Timestamp'].dt.dayofweek
    df
    Out[2]:
                Timestamp  Value  weekday
    0 2012-06-01 00:00:00    100        4
    1 2012-06-01 00:15:00    150        4
    2 2012-06-01 00:30:00    120        4
    3 2012-06-01 01:00:00    220        4
    4 2012-06-01 01:15:00     80        4
    

    Timestamp 是您的索引的情况下,您需要重置索引,然后调用dt.dayofweek 属性:

    In [14]:
    
    df = df.reset_index()
    df['weekday'] = df['Timestamp'].dt.dayofweek
    df
    Out[14]:
                Timestamp  Value  weekday
    0 2012-06-01 00:00:00    100        4
    1 2012-06-01 00:15:00    150        4
    2 2012-06-01 00:30:00    120        4
    3 2012-06-01 01:00:00    220        4
    4 2012-06-01 01:15:00     80        4
    

    奇怪的是,如果您尝试从索引创建一个系列以便不重置索引,您将获得 NaN 值,就像使用 reset_index 的结果调用 dt.dayofweek 属性而不分配 @987654330 的结果一样@回到原来的df:

    In [16]:
    
    df['weekday'] = pd.Series(df.index).dt.dayofweek
    df
    Out[16]:
                         Value  weekday
    Timestamp                          
    2012-06-01 00:00:00    100      NaN
    2012-06-01 00:15:00    150      NaN
    2012-06-01 00:30:00    120      NaN
    2012-06-01 01:00:00    220      NaN
    2012-06-01 01:15:00     80      NaN
    In [17]:
    
    df['weekday'] = df.reset_index()['Timestamp'].dt.dayofweek
    df
    Out[17]:
                         Value  weekday
    Timestamp                          
    2012-06-01 00:00:00    100      NaN
    2012-06-01 00:15:00    150      NaN
    2012-06-01 00:30:00    120      NaN
    2012-06-01 01:00:00    220      NaN
    2012-06-01 01:15:00     80      NaN
    

    编辑

    正如用户 @joris 向我指出的那样,您可以访问索引的 weekday 属性,这样以下内容将起作用并且更紧凑:

    df['Weekday'] = df.index.weekday

    【讨论】:

      【解决方案2】:

      如果Timestamp 列是datetime 值,那么您可以使用:
      df['weekday'] = df['Timestamp'].apply(lambda x: x.weekday())

      df['weekday'] = pd.to_datetime(df['Timestamp']).apply(lambda x: x.weekday())

      【讨论】:

        【解决方案3】:

        如果其他人对多索引数据框有同样的问题,下面是我根据@joris 解决方案为我解决的问题:

        df['Weekday'] = df.index.get_level_values(1).weekday
        

        对我来说,日期是 get_level_values(1) 而不是 get_level_values(0),这适用于外部索引。

        【讨论】:

          【解决方案4】:

          你可以通过这种方式获得:

          import datetime
          df['weekday'] = pd.Series(df.index).dt.day_name()
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-01-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多