Подтвердить что ты не робот

Pandas: час возврата из столбца Datetime Directly

Предположим, у меня есть DataFrame sales значений временной метки:

timestamp               sales_office
2014-01-01 09:01:00     Cincinnati
2014-01-01 09:11:00     San Francisco
2014-01-01 15:22:00     Chicago
2014-01-01 19:01:00     Chicago

Я хотел бы создать новый столбец time_hour. Я могу создать его, написав короткую функцию так и используя apply(), чтобы применить его итеративно:

def hr_func(ts):
    return ts.hour

sales['time_hour'] = sales['timestamp'].apply(hr_func)

Я бы увидел этот результат:

timestamp               sales_office         time_hour
2014-01-01 09:01:00     Cincinnati           9
2014-01-01 09:11:00     San Francisco        9
2014-01-01 15:22:00     Chicago              15
2014-01-01 19:01:00     Chicago              19

То, что я хотел бы достичь, - это более короткая трансформация, подобная этой (которая, как я знаю, ошибочна, но попадает в дух):

sales['time_hour'] = sales['timestamp'].hour

Очевидно, что столбец имеет тип Series и как таковой не имеет этих атрибутов, но кажется, что существует более простой способ использования матричных операций.

Существует ли более прямой подход?

4b9b3361

Ответ 1

Предполагая, что метка времени является индексом фрейма данных, вы можете просто сделать

    hours = sales.index.hour

Если вы хотите добавить это в свой кадр данных продаж, просто сделайте

    import pandas as pd
    pd.concat([sales, pd.DataFrame(hours, index=sales.index)], axis = 1)

Изменить: Если у вас несколько столбцов объектов datetime, это тот же процесс. Если в вашем фреймворке есть столбец ['date'], и если предположить, что "дата" имеет значения даты и времени, вы можете получить доступ к часу с "даты" следующим образом:

    hours = sales['date'].hour

Ответ 2

Для потомков: от 0.15.0 есть удобный .dt accessor, вы можете использовать, чтобы вытащить такие значения из серии datetime/period (в приведенном выше случае просто sales.timestamp.dt.hour!

Ответ 3

Вы можете использовать выражение лямбда, например:

sales['time_hour'] = sales.timestamp.apply(lambda x: x.hour)

Ответ 4

Вы можете попробовать это:

sales['time_hour'] = pd.to_datetime(sales['timestamp']).dt.hour