Python 日期偏移和转换
我试图将字段解释为日期,将日期更改为表示该日期出现的月份,将日期偏移一个月,然后将其表示为没有时间戳的日期。我的结局是这样的,看起来和感觉都太笨拙了:Python 日期偏移和转换,python,datetime,pandas,Python,Datetime,Pandas,我试图将字段解释为日期,将日期更改为表示该日期出现的月份,将日期偏移一个月,然后将其表示为没有时间戳的日期。我的结局是这样的,看起来和感觉都太笨拙了: df['DATE'].apply( lambda d: pd.to_datetime(pd.to_datetime(d).to_period('M').to_timestamp('M')\ - np.timedelta64(1,'M')).date()) 时间戳
df['DATE'].apply( lambda d: pd.to_datetime(pd.to_datetime(d).to_period('M').to_timestamp('M')\
- np.timedelta64(1,'M')).date())
时间戳是以下格式的字符串:
2012-09-01 00:00:00
有没有更好的办法?谢谢。好吧,你可以避免应用,并将其矢量化(我认为这会让它变得更好): 当然,日期仍然是
datetime64[ns]
,因为pandas总是转换为该日期
编辑:假设您想要上个月的月底而不是上个月的月底:
df['date'] = (pd.to_datetime(df['date']).values.astype('datetime64[M]')
- np.timedelta64(1,'D'))
print df
date x1
0 2009-11-30 10
1 2009-12-31 10
2 2010-01-31 10
3 2010-02-28 10
4 2010-02-28 5
5 2010-03-31 5
编辑:杰夫指出,一种更为泛化的方法是将日期设为DatetimeIndex
,并使用日期偏移量。比如:
df['date'] = pd.Index(df['date']).to_datetime() - pd.offsets.MonthBegin(1)
print df
date x1
0 2009-12-01 10
1 2010-01-01 10
2 2010-02-01 10
3 2010-03-01 10
4 2010-03-01 5
5 2010-04-01 5
或月底:
df['date'] = pd.Index(df['date']).to_datetime() - pd.offsets.MonthEnd(1)
print df
date x1
0 2009-12-31 10
1 2010-01-31 10
2 2010-02-28 10
3 2010-03-31 10
4 2010-03-31 5
5 2010-04-30 5
这很好。比
apply()
快得多。您知道是否可以使用datetime64[M]
查找月底而不是月初吗?更泛化的方法是将其视为索引,并使用具有适当偏移量的回滚。请参见此处:谢谢。将您的建议添加到回答中8您实际上没有使其成为索引刚设置框=False我认为在pd上。to_datetime然后减去偏移量(但您所做的也可以)偏移量与时间戳/Timedelta&DatetimeIndex/PeriodIndex/TimedeltaIndex一起工作
df['date'] = pd.Index(df['date']).to_datetime() - pd.offsets.MonthEnd(1)
print df
date x1
0 2009-12-31 10
1 2010-01-31 10
2 2010-02-28 10
3 2010-03-31 10
4 2010-03-31 5
5 2010-04-30 5