今週もPandasの小ネタです。
CSVファイルのカラムをdatetime64としてロードする方法です。
Pandasはdatetime型を食わせるとdatetime64のSeriesになります。.dt
プロパティも使えます。ここではカラムcがdatetime64になります。
import pandas as pd import datetime t = datetime.datetime.now() df = pd.DataFrame({ 'a': [1, 2, 3], 'b': ['01', '02', '03'], 'c': [t, t, t] }) print(df.info()) # <class 'pandas.core.frame.DataFrame'> # RangeIndex: 3 entries, 0 to 2 # Data columns (total 3 columns): # a 3 non-null int64 # b 3 non-null object # c 3 non-null datetime64[ns] # dtypes: datetime64[ns](1), int64(1), object(1) # memory usage: 152.0+ bytes df.to_csv('test.csv', index=False)
to_csvで出力し、このままread_csvで読み込むとobject (文字列) として認識されてしまいます。そのため.dt
プロパティなどもアクセスできません。
- ちなみにカラムbは、もともと文字列だったのですが、int64としてロードされています
df1 = pd.read_csv('test.csv') print(df1.info()) # <class 'pandas.core.frame.DataFrame'> # RangeIndex: 3 entries, 0 to 2 # Data columns (total 3 columns): # a 3 non-null int64 # b 3 non-null int64 # c 3 non-null object # dtypes: int64(2), object(1) # memory usage: 152.0+ bytes print(df1['c'].dt.date) # AttributeError: Can only use .dt accessor with datetimelike values
read_csvの引数parse_dates
にdatetime64として認識させたいカラムをリストで指定すると、正しくロードできるようになります。
- カラムbのように文字列としてロードさせたい場合、引数
dtype
に辞書形式で渡します
df2 = pd.read_csv('test.csv', dtype = {'b':'object'}, parse_dates=['c']) print(df2.info()) # <class 'pandas.core.frame.DataFrame'> # RangeIndex: 3 entries, 0 to 2 # Data columns (total 3 columns): # a 3 non-null int64 # b 3 non-null object # c 3 non-null datetime64[ns] # dtypes: datetime64[ns](1), int64(1), object(1) # memory usage: 152.0+ bytes print(df2['c'].dt.date) # 0 2019-05-11 # 1 2019-05-11 # 2 2019-05-11 # Name: c, dtype: object