Get weekday/day-of-week for Datetime column of DataFrame

后端 未结 3 934
离开以前
离开以前 2020-12-01 09:07

I have a DataFrame df like the following (excerpt, \'Timestamp\' are the index):

Timestamp              Value
2012-06-01 00:00:00     100
2012-0         


        
相关标签:
3条回答
  • 2020-12-01 09:31

    In case somebody else has the same issue with a multiindexed dataframe, here is what solved it for me, based on @joris solution:

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

    for me date was the get_level_values(1) instead of get_level_values(0), which would work for the outer index.

    0 讨论(0)
  • 2020-12-01 09:35

    Use the new dt.dayofweek property:

    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
    

    In the situation where the Timestamp is your index you need to reset the index and then call the dt.dayofweek property:

    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
    

    Strangely if you try to create a series from the index in order to not reset the index you get NaN values as does using the result of reset_index to call the dt.dayofweek property without assigning the result of reset_index back to the original 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
    

    EDIT

    As pointed out to me by user @joris you can just access the weekday attribute of the index so the following will work and is more compact:

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

    0 讨论(0)
  • 2020-12-01 09:41

    If the Timestamp column is a datetime value, then you can just use:
    df['weekday'] = df['Timestamp'].apply(lambda x: x.weekday())

    or

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

    0 讨论(0)
提交回复
热议问题