熊猫日期抵消和转换

时间:2014-05-09 00:03:22

标签: 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())

时间戳是这种格式的字符串:

    2012-09-01 00:00:00

任何更好的方法?感谢。

1 个答案:

答案 0 :(得分:8)

好吧,你可以避免申请并进行矢量化(我认为这会让它更好一些):

print df

                  date  x1
0  2010-01-01 00:00:00  10
1  2010-02-01 00:00:00  10
2  2010-03-01 00:00:00  10
3  2010-04-01 00:00:00  10
4  2010-04-01 00:00:00   5
5  2010-05-01 00:00:00   5

df['date'] = (pd.to_datetime(df['date']).values.astype('datetime64[M]')
              - np.timedelta64(1,'M'))
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

当然,日期仍然是datetime64[ns],因为大熊猫总是转换为。{/ p>

编辑:假设您想要上个月结束而不是上个月的开始:

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