web-dev-qa-db-ja.com

パンダ:日時列から直接時間を返す

タイムスタンプ値のDataFrame salesがあると仮定します。

_timestamp               sales_office
2014-01-01 09:01:00     Cincinnati
2014-01-01 09:11:00     San Francisco
2014-01-01 15:22:00     Chicago
2014-01-01 19:01:00     Chicago
_

新しい列_time_hour_を作成したいと思います。短い関数を作成し、apply()を使用して繰り返し適用することで作成できます。

_def hr_func(ts):
    return ts.hour

sales['time_hour'] = sales['timestamp'].apply(hr_func)
_

この結果が表示されます。

_timestamp               sales_office         time_hour
2014-01-01 09:01:00     Cincinnati           9
2014-01-01 09:11:00     San Francisco        9
2014-01-01 15:22:00     Chicago              15
2014-01-01 19:01:00     Chicago              19
_

私がlikeを達成したいのは、次のような短い変換です(間違っていることはわかっていますが、精神に到達します)。

_sales['time_hour'] = sales['timestamp'].hour
_

明らかに列はSeries型であり、そのような属性はありませんが、行列演算を使用するより簡単な方法があるようです。

より直接的なアプローチはありますか?

36
Daniel Black

タイムスタンプがデータフレームのインデックスであると仮定すると、あなたはちょうどすることができます

    hours = sales.index.hour

それを販売データフレームに追加したい場合は、

    import pandas as pd
    pd.concat([sales, pd.DataFrame(hours, index=sales.index)], axis = 1)

編集:日時オブジェクトの列が複数ある場合は、同じプロセスです。データフレームに列['date']があり、 'date'にdatetime値があると仮定すると、 'date'から次のように時間にアクセスできます。

    hours = sales['date'].hour
24
Sudipta Basak

後世の場合: .15. の場合、便利な 。dtアクセサ があります。このような値をdatetime/periodシリーズから取得できます(上記の場合、 sales.timestamp.dt.hour

37
iff_or

lambda expression を使用できます。例:

sales['time_hour'] = sales.timestamp.apply(lambda x: x.hour)
11
Bob Hannon

これを試すことができます:

sales['time_hour'] = pd.to_datetime(sales['timestamp']).dt.hour
4
TCO