date - offsets.MonthBegin (1) возвращает предыдущий месяц, если дата является первым месяца - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь создать столбец месяца для кадра данных панд. Изменение «21.10.199» на «01.10.19». Следующее работает для большинства дат, но меняет первое число на предыдущий месяц:

ts = '2016-03-05 00:20:02'
pd.to_datetime(ts) - pd.offsets.MonthBegin(1)
# returns 'Timestamp('2016-03-01 00:20:02')'

ts = '2016-03-01 00:20:02'
pd.to_datetime(ts) - pd.offsets.MonthBegin(1)
# returns 'Timestamp('2016-02-01 00:20:02')'

ts = '2016-03-01 00:20:02'
pd.to_datetime(ts) + pd.offsets.MonthBegin(1) - pd.offsets.MonthBegin(1)
# returns 'Timestamp('2016-03-01 00:20:02')'

Я нашел решение в третьем примере. Сначала обновление до конца месяца, затем обновление до начала. Я чувствую, что должен быть более питонический способ сделать это, учитывая, насколько распространен этот вид трансформации.

1 Ответ

0 голосов
/ 01 октября 2019

Необходимая функциональность обеспечивается функцией rollback:

ts1 = '2016-03-05 00:20:02'
ts2 = '2016-03-01 00:20:02'
ts3 = '2016-03-31 00:20:02'
pd.offsets.MonthBegin().rollback(ts1)
#Timestamp('2016-03-01 00:20:02')
pd.offsets.MonthBegin().rollback(ts2)
#Timestamp('2016-03-01 00:20:02')
pd.offsets.MonthBegin().rollback(ts3)
#Timestamp('2016-03-01 00:20:02')


Если у вас есть столбец даты и времени и вы хотите сократить его до месяцев, вы можететакже временно изменить точность базового типа numpy datetime64:
df = pd.DataFrame({'Date': ['2016-03-05 00:20:02', '2016-03-01 00:20:02', '2016-03-31 00:20:02']})
df.Date = pd.to_datetime(df.Date)

df['Month'] = df.Date.astype('<M8[M]')
print(df)
#                 Date      Month
#0 2016-03-05 00:20:02 2016-03-01
#1 2016-03-01 00:20:02 2016-03-01
#2 2016-03-31 00:20:02 2016-03-01

(взято из этого SO ответа)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...