web-dev-qa-db-ja.com

月末を見つけるPandas DataFrame Series

最初にオブジェクトとして読み込むDataFrame内にシリーズがあり、それをyyyy-mm-ddの形式の日付に変換する必要があります(ddは月末です)。

例として、オブジェクトとして列Dateを持つDataFrame dfがあります。

...      Date    ...
...     200104   ...
...     200508   ...

これがすべて言われて完了したときに私が欲しいのは、日付オブジェクトです:

...      Date    ...
...  2001-04-30  ...
...  2005-08-31  ...

df ['Date']。item()が返すように

datetime.date(2001, 04, 30)

次のコードを使用してほぼそこに到達しましたが、すべての日付は月末ではなく月の初めにあります。お知らせ下さい。

df['Date'] = pd.to_datetime(df['Date'], format="%Y%m").dt.date

注:既にPandas ad pd、datetimeをdtとしてインポートしています

34
Lisle

_pandas.tseries.offsets.MonthEnd_を使用できます:

_from pandas.tseries.offsets import MonthEnd

df['Date'] = pd.to_datetime(df['Date'], format="%Y%m") + MonthEnd(1)
_

MonthEndの_1_は、1か月先の次の日付に1ステップ進むことを指定するだけです。 (_0_を使用するか、空白のままにしておくこともできます)。翌月の最終日が必要な場合は、MonthEnd(2)などを使用します。これはどの月でも機能するはずです。そのため、月の日数などを知る必要はありません。それ。より多くのオフセット情報は documentation にあります。

使用例と出力:

_df = pd.DataFrame({'Date': [200104, 200508, 201002, 201602, 199912, 200611]})
df['EndOfMonth'] = pd.to_datetime(df['Date'], format="%Y%m") + MonthEnd(1)

     Date EndOfMonth
0  200104 2001-04-30
1  200508 2005-08-31
2  201002 2010-02-28
3  201602 2016-02-29
4  199912 1999-12-31
5  200611 2006-11-30
_
63
root

ルートが提供することに同意することは正しい方法です。ただし、MonthEnd(1)を盲目的に使用する読者は、月の最後の日付を入力として使用すると、驚くことになります。

_In [4]: pd.Timestamp('2014-01-01')+MonthEnd(1)
Out[4]: Timestamp('2014-01-31 00:00:00')

In [5]: pd.Timestamp('2014-01-31')+MonthEnd(1)
Out[5]: Timestamp('2014-02-28 00:00:00')
_

代わりにMonthEnd(0)を使用すると、これが得られます。

_In [7]: pd.Timestamp('2014-01-01')+MonthEnd(0)
Out[7]: Timestamp('2014-01-31 00:00:00')

In [8]: pd.Timestamp('2014-01-31')+MonthEnd(0)
Out[8]: Timestamp('2014-01-31 00:00:00')
_
28

つかいます - dateutil.relativedelta 。次に、月の最初に相対デルタを追加します。

import dateutil.relativedelta as rd

datetime.date(2001, 4, 1) + rd.relativedelta(day=31)

あなたを取得します:

datetime.date(2001, 4, 30)
1
piRSquared