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