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
ウィザードリがありますか?
pandas 0.18.0以降では、datetime floor
、 ceil
および-があります 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'
など:
'<M8[Y]'
'<M8[M]'
'<M8[D]'
'<M8[m]'
'<M8[s]'
この目標を達成するために私が過去に使用した方法は次のとおりです(あなたがすでにやっていることと非常に似ていますが、とにかくそこに捨てると思った):
df['dt2'] = df['dt'].apply(lambda x: x.replace(minute=0, second=0))