簡體   English   中英

熊貓日期抵消和轉換

[英]Pandas date offset and conversion

我試圖將字段解釋為日期,更改日期以表示日期顯示的月份,將日期偏移一個月,然后將其表示為沒有時間戳的日期。 我最終得到了看起來和感覺太笨重的東西:

    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

有什么想法更好的方法嗎? 謝謝。

好吧,你可以避免應用並進行矢量化(我認為這會使它更好一些):

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]因為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM