web-dev-qa-db-ja.com

pandas.to_datetimeを使用するときに日付部分のみを保持する

データ内の日付を解析するためにpandas.to_datetimeを使用します。デフォルトでは、パンダは日付がすべて毎日のみであっても、日付をdatetime64[ns]で表します。日付をdatetime.dateまたはdatetime64[D]に変換するためのエレガントで賢い方法があるのではないかと思うので、データをCSVに書き込むときに日付に00:00:00が追加されないようにします。要素ごとに手動で型を変換できることはわかっています。

[dt.to_datetime().date() for dt in df.dates]

しかし、私は多くの行を持っているのでこれは本当に遅いです、そしてそれはpandas.to_datetimeを使う目的を無効にします。列全体のdtypeを一度に変換する方法はありますか?あるいは、pandas.to_datetimeは精度の仕様をサポートしているので、毎日のデータを処理しながら時間の部分を取り除くことができますか?

116
user1642513

バージョン0.15.0以降、これは日付コンポーネントだけにアクセスするために .dt を使って簡単に実行できます。

df['just_date'] = df['dates'].dt.date

上記はdatetime.date dtypeを返します、もしあなたがdatetime64を持ちたいのであれば、 normalize timeコンポーネントを真夜中にすることができるので、すべての値を00:00:00に設定します。

df['normalised_date'] = df['dates'].dt.normalize()

これはdtypeをdatetime64のままにしますが、ディスプレイにはdateの値だけが表示されます。

169
EdChum

OPが提起した質問に対する最も直接的な答えであるEdChumの答えを支持しましたが、それはパフォーマンスの問題を実際には解決しません(それでもまだpython datetimeオブジェクトに依存しているので、それらに対する操作はベクトル化されません)。遅くなります)。

より優れた代替方法df['dates'].dt.floor('d')を使うことです。厳密に言えば、時間を00:00:00に設定するだけなので、「日付部分のみを保持する」ということではありません。しかし、それは、例えば以下のような場合、OPの望みどおりに機能します。

  • スクリーンへの印刷
  • csvに保存
  • groupbyへの列の使用

...そして操作はベクトル化されているので、はるかに効率的です。

編集:実際には、OPのほうが好ましいと思う答えは、おそらく "最近のバージョンのpandas do notにする時間です。すべての観測値に対して00:00:00の場合はcsvです "#:。

17

Pandas DatetimeIndexSeriesには、 normalize という名前のメソッドがあり、それはあなたが望むことを正確に行います。

あなたはそれについてもっと読むことができます この答え

ser.dt.normalize()として使うことができます

14
j08lue

これは日付を抽出する簡単な方法です。

import pandas as pd

d='2015-01-08 22:44:09' 
date=pd.to_datetime(d).date()
print(date)
5
Mani Abi Anand

Pandas v0.13 +:to_csvパラメーターと一緒に date_format を使う

可能であれば、datetime64[ns]シリーズをobject dtypeシリーズのdatetime.dateオブジェクトに変換しないでください。後者はしばしば pd.Series.dt.date を使って構築され、ポインタの配列として格納され、純粋なNumPyベースの系列と比較して非効率的です。

あなたが心配しているのはCSVへの書き込み時のフォーマットなので、date_formatto_csvパラメータを使うだけです。例えば:

df.to_csv(filename, date_format='%Y-%m-%d')

フォーマット規則については Pythonのstrftimeディレクティブ を参照してください。

5
jpp

datetime64[D]に変換する:

df.dates.values.astype('M8[D]')

それをDataFrame colに再割り当てすると、それを[ns]に戻します。

実際のdatetime.dateが欲しいならば:

dt = pd.DatetimeIndex(df.dates)
dates = np.array([datetime.date(*date_Tuple) for date_Tuple in Zip(dt.year, dt.month, dt.day)])
3
Dale Jung

簡単な解決策

df['date_only'] = df['date_time_column'].dt.date
2
Gil Baggio

nullの値がある場合、または列のタイプがobjectである場合、このアプローチは以前のすべてのものよりも役立ちました。

df['DATE'] = pd.to_datetime(df['DATE'], errors='ignore', format='%Y%m%d')
0
Gonzalo Garcia