方法
使用前
sample.csvをpandasのdataframeに読み込み、info()を取ると、DATEカラムもTIMEカラムもobjectとして読み込まれていることがわかります。より詳しくtypeを見ると、いずれも単なるstr。
これだと何かと不便なので、これらをまとめてdatetime型に変換したい。
import pandas as pd # CSVの読み込み >>> my_df = pd.read_csv('sample.csv') # データフレームのinfoを取る。 >>> my_df.info() <class 'pandas.core.frame.DataFrame'> RangeIndex: 4 entries, 0 to 3 Data columns (total 4 columns): DATE 4 non-null object TIME 4 non-null object EVENT 4 non-null object SOURCE 4 non-null object dtypes: float64(0), int64(0), object(4) # より詳しく、試しに最初のデータを取り出してtypeを確認 >>> type(my_df['DATE'][0]) str >>> type(my_df['TIME'][0]) str
sample.csv
DATE | TIME | EVENT | SOURCE |
---|---|---|---|
2020-01-01 | 06:50 | Sunrise in Tokyo | https://eco.mtk.nao.ac.jp/koyomi/dni/2020/s1301.html |
2020-01-01 | 10:50 | Moonrise in Tokyo | https://eco.mtk.nao.ac.jp/koyomi/dni/2020/m1301.html |
2020-01-01 | 16:38 | Sunset in Tokyo | https://eco.mtk.nao.ac.jp/koyomi/dni/2020/s1301.html |
2020-01-01 | 22:16 | Moonset in Tokyo | https://eco.mtk.nao.ac.jp/koyomi/dni/2020/m1301.html |
Download: sample.csv [371 B]
一発変換
pandasのpandas.to_datetime()メソッドを使ってDATEとTIMEのSeries(カラム)をdatetime型に一発変換。
my_df['DATE'] = pd.to_datetime(my_df['DATE']) my_df['TIME'] = pd.to_datetime(my_df['TIME']) # 実は、時刻の方は下手に変換しない方が良さそう。
より詳しい使い方はPandasのドキュメントを見るとわかりやすく解説してあります。
使用後
変換後に改めてdataframeのinfo()、DATEカラムとTIMEカラムのtypeを確認。良さげ。
# データフレームのinfoを取る。 >>> my_df.info() <class 'pandas.core.frame.DataFrame'> RangeIndex: 4 entries, 0 to 3 Data columns (total 4 columns): DATE 4 non-null datetime64[ns] TIME 4 non-null datetime64[ns] EVENT 4 non-null object SOURCE 4 non-null object dtypes: datetime64[ns](2), float64(0), int64(0), object(2) # より詳しく、試しに最初のデータを取り出してtypeを確認 >>> type(my_df['DATE'][0]) pandas._libs.tslibs.timestamps.Timestamp >>> type(my_df['TIME'][0]) pandas._libs.tslibs.timestamps.Timestamp
問題点
上記の方法だと、my_df[‘TIME’]に入っている値には、時刻情報だけではなく、変換した日の日付が情報として付加されてしまいます。これは困る。なので、自分以外の人が触る可能性があるスクリプトの場合は、あまり必要が無いなら時刻の方はstrで放置しておくとか、あるいはDATEとTIMEを結合しておいて、普通にTimestampにしておいた方が安全かもしれません。
このあたり、官邸の「各府省情報化統括責任者(CIO)連絡会議」の資料では「日付と時刻の組み合わせ」の項目で、「日付と時刻は、『日付』と『時刻』の 2 つのデータ項目で設定することが望ましい。」とあります。
だとすると、設定時はDATEとTIMEを分けておいて、処理するときには例えばyyyy-mm-ddTHH:MMのような形にして片付けた方が良いのでしょうか?
などと蘊蓄を垂れていたら いずこからともなく神様の声が…
あんなぁ、Python に限らず日付・時刻/時間関係の data type には大きく、
date, time, datetime, timestamp の 4 種類があって、それぞれに特徴や適した使い方があるんやで!その辺わきまえないで「これは困る」とかテキトーなこと言うとったらあかんで、ホンマ💢
えらいすんまへん 🙇♂️