小ネタ: PandasでCSVファイルからdatetimeカラムをロードする

今週も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