我正在尝试为熊猫数据框创建月份列。将“ 10/21/19”更改为“ 10/1/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')'
我在第三个示例中找到了解决方案。首先更新到月底,然后再更新回开始。考虑到这种转换的普遍性,我觉得应该有一种更Python化的方法来进行此操作。
[rollback
功能提供所需的功能:
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')
类型的精度: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答案)