web-dev-qa-db-ja.com

pandas `DataFrame`で` TimeStamp`列を時間の精度に切り捨てます

dfと呼ばれるpandas.DataFrameがあり、これには自動生成されたインデックスがあり、列dtがあります。

df['dt'].dtype, df['dt'][0]
# (dtype('<M8[ns]'), Timestamp('2014-10-01 10:02:45'))

私がやりたいのは、時間の精度に切り捨てられた新しい列を作成することです。私は現在使用しています:

df['dt2'] = df['dt'].apply(lambda L: datetime(L.year, L.month, L.day, L.hour))

これは機能するので、それで問題ありません。ただし、pandas.tseries.offsetsを使用したり、DatetimeIndexなどを作成したりする素敵な方法があります。

可能であれば、これを行うためのいくつかのpandasウィザードリがありますか?

27
Jon Clements

pandas 0.18.0以降では、datetime floorceil および-があります round タイムスタンプを特定の固定精度/周波数に丸めるメソッド時間精度に切り捨てるには、次を使用できます。

>>> df['dt2'] = df['dt'].dt.floor('h')
>>> df
                      dt                     dt2
0    2014-10-01 10:02:45     2014-10-01 10:00:00
1    2014-10-01 13:08:17     2014-10-01 13:00:00
2    2014-10-01 17:39:24     2014-10-01 17:00:00

タイムスタンプを切り捨てる別の方法を次に示します。 floorとは異なり、年や月などの精度への切り捨てをサポートしています。

基礎となるNumPy datetime64データ型の精度単位を一時的に調整し、[ns]から[h]に変更できます。

df['dt'].values.astype('<M8[h]')

これにより、すべてが時間単位の精度に切り捨てられます。例えば:

>>> df
                       dt
0     2014-10-01 10:02:45
1     2014-10-01 13:08:17
2     2014-10-01 17:39:24

>>> df['dt2'] = df['dt'].values.astype('<M8[h]')
>>> df
                      dt                     dt2
0    2014-10-01 10:02:45     2014-10-01 10:00:00
1    2014-10-01 13:08:17     2014-10-01 13:00:00
2    2014-10-01 17:39:24     2014-10-01 17:00:00

>>> df.dtypes
dt     datetime64[ns]
dt2    datetime64[ns]

同じ方法が他のユニットでも機能するはずです:月'M'、分'm'など:

  • 1年以内:'<M8[Y]'
  • 最大1か月間:'<M8[M]'
  • 常に最新の状態に保つ:'<M8[D]'
  • しばらくお待ちください:'<M8[m]'
  • 秒まで:'<M8[s]'
57
Alex Riley

この目標を達成するために私が過去に使用した方法は次のとおりです(あなたがすでにやっていることと非常に似ていますが、とにかくそこに捨てると思った):

df['dt2'] = df['dt'].apply(lambda x: x.replace(minute=0, second=0))
2
David Hagan