Получить день недели / день недели для столбца Datetime в DataFrame

У меня есть датафрейм df как следующее (отрывок, отметка времени - индекс):

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'] с соответствующим днем ​​недели / днем ​​недели меток времени.

Как я могу получить это?

5 ответов

Решение

Используйте новый 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 свойство без присвоения результата reset_index вернуться к исходному 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

Если Timestamp если datatime, тогда вы можете просто использовать:
df['weekday'] = df['Timestamp'].apply(lambda x: x.weekday())

или же

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

Вы можете получить таким образом:

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

Начиная с pandas 1.1.0 dt.dayofweek устарел, поэтому вместо:

      df['weekday'] = df['Timestamp'].dt.dayofweek

от @EdChum и @Артема Криволапова

теперь вы можете использовать:

      df['weekday'] = df['Timestamp'].dt.isocalendar().day

В случае, если у кого-то еще есть такая же проблема с многоиндексированным фреймом данных, вот что решило ее для меня на основе решения @joris:

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

для меня свидание было get_level_values(1) вместо того get_level_values(0), который будет работать для внешнего индекса.

Другие вопросы по тегам