データ内の日付を解析するために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
は精度の仕様をサポートしているので、毎日のデータを処理しながら時間の部分を取り除くことができますか?
バージョン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
の値だけが表示されます。
OPが提起した質問に対する最も直接的な答えであるEdChumの答えを支持しましたが、それはパフォーマンスの問題を実際には解決しません(それでもまだpython datetime
オブジェクトに依存しているので、それらに対する操作はベクトル化されません)。遅くなります)。
より優れた代替方法 はdf['dates'].dt.floor('d')
を使うことです。厳密に言えば、時間を00:00:00
に設定するだけなので、「日付部分のみを保持する」ということではありません。しかし、それは、例えば以下のような場合、OPの望みどおりに機能します。
groupby
への列の使用...そして操作はベクトル化されているので、はるかに効率的です。
編集:実際には、OPのほうが好ましいと思う答えは、おそらく "最近のバージョンのpandas
do notにする時間です。すべての観測値に対して00:00:00
の場合はcsvです "#:。
これは日付を抽出する簡単な方法です。
import pandas as pd
d='2015-01-08 22:44:09'
date=pd.to_datetime(d).date()
print(date)
to_csv
パラメーターと一緒に date_format
を使う可能であれば、datetime64[ns]
シリーズをobject
dtypeシリーズのdatetime.date
オブジェクトに変換しないでください。後者はしばしば pd.Series.dt.date
を使って構築され、ポインタの配列として格納され、純粋なNumPyベースの系列と比較して非効率的です。
あなたが心配しているのはCSVへの書き込み時のフォーマットなので、date_format
のto_csv
パラメータを使うだけです。例えば:
df.to_csv(filename, date_format='%Y-%m-%d')
フォーマット規則については Pythonのstrftime
ディレクティブ を参照してください。
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)])
簡単な解決策
df['date_only'] = df['date_time_column'].dt.date
null
の値がある場合、または列のタイプがobject
である場合、このアプローチは以前のすべてのものよりも役立ちました。
df['DATE'] = pd.to_datetime(df['DATE'], errors='ignore', format='%Y%m%d')