Как объединить столбец datetime в ближайший квартал
Я загрузил файл данных в фреймворк Python pandas. У меня есть столбец datetime формата 2015-07-18 13:53:33.280
.
Мне нужно создать новый столбец, который округляет его до ближайшего квартала. Итак, дата выше будет округлена до 2015-07-18 13:45:00.000
.
Как это сделать в pandas? Я попытался использовать решение здесь, но получаю ошибку 'Series' object has no attribute 'year'
.
Ответы
Ответ 1
Предполагая, что ваша серия состоит из объектов datetime
, вам нужно использовать Series.apply
. Пример -
import datetime
df['<column>'] = df['<column>'].apply(lambda dt: datetime.datetime(dt.year, dt.month, dt.day, dt.hour,15*(dt.minute // 15)))
Приведенный выше пример всегда округляется до предыдущего квартала (поведение похожее на функцию пола).
ИЗМЕНИТЬ
Чтобы округлить до нужного квартала (как в, если его 7 минут 30 секунд прошлого квартала, чтобы показать следующий квартал). Мы можем использовать приведенный ниже пример -
import datetime
df['<column>'] = df['<column>'].apply(lambda dt: datetime.datetime(dt.year, dt.month, dt.day, dt.hour,15*round((float(dt.minute) + float(dt.second)/60) / 15)))
Приведенные выше соображения учитывают только последние секунды, если вы хотите учитывать миллисекунду/микросекунду, вы можете добавить это к вышеуказанному уравнению как - (float(dt.minute) + float(dt.second)/60 + float(dt.microsecond)/60000000)
Ответ 2
Вы можете использовать round(freq)
. Существует также ярлык column.dt
для доступа к функциям даты и времени (как предлагает @laurens-koppenol).
Здесь однострочник:
df['old column'].dt.round('15min')
Строковые псевдонимы для допустимых частот можно найти здесь. Полный рабочий пример:
In [1]: import pandas as pd
In [2]: df = pd.DataFrame([pd.Timestamp('2015-07-18 13:53:33.280'),
pd.Timestamp('2015-07-18 13:33:33.330')],
columns=['old column'])
In [3]: df['new column']=df['old column'].dt.round('15min')
In [4]: df
Out[4]:
old column new column
0 2015-07-18 13:53:33.280 2015-07-18 14:00:00
1 2015-07-18 13:33:33.330 2015-07-18 13:30:00
Ответ 3
Это выглядит немного приятнее
column.dt.
позволяет использовать функции datetime для столбцов datetime, например column.str.
для столбцов типа string
свойства API-ссылки, связанные с datetime
import pandas as pd
# test df
df = pd.DataFrame([{'old_column':pd.Timestamp('2015-07-18 13:53:33.280')}])
df['new_column'] = df['old_column'].dt.round('15min')
df
Ответ 4
Ответ Anand S Kumar не округляется до ближайшего квартала, он отключает минуты до ближайших 15 минут.
Собственно, в вашем примере 2015-07-18 13:53:33.280
должен округлить до 2015-07-18 14:00:00.000
, так как 53:33.280
ближе к 60 минутам, чем 45 минут.
Я нашел более надежный ответ для округления в этом сообщении.
Для вашей ситуации это должно работать:
import datetime
def round_time(time, round_to):
"""roundTo is the number of minutes to round to"""
rounded = time + datetime.timedelta(minutes=round_to/2.)
rounded -= datetime.timedelta(minutes=rounded.minute % round_to,
seconds=rounded.second,
microseconds=rounded.microsecond)
return rounded
dt['dtcolumn'] = df['dtcolumn'].apply(lambda x: round_time(x))