Получить день недели / день недели для столбца 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)
, который будет работать для внешнего индекса.