【時系列データ】pandas.read_csvでdatetime型にしてからファイルを読み込む


投稿日 2021年12月29日 >> 更新日 2023年3月1日

概要

以下のようなCSVファイル内のデータにタイムスタンプ列が存在していて、pandasのread_csvで読み込む際にタイムスタンプ列をdatetime型として読み込ませる。時系列データとして操作したい場合に役立つ。

# ファイルの中身を確認。
# headコマンドで5行まで抽出
! head date.csv -n 5
"""
,Value
2021-12-01,0
2021-12-02,1
2021-12-03,2
2021-12-04,3
"""

実行環境&使用ライブラリ

実行環境
Windows Subsystem for Linux
Python 3.6.9
pip 9.0.1
jupyter notebook
使用ライブラリ ライセンス
pandas==1.0.0 BSD

デフォルトでのread_csvの動作

カレントディレクトリにあるCSVファイルの中身を確認。

# ファイルの中身を確認。
# headコマンドで5行まで抽出
! head date.csv -n 5
"""
,Value
2021-12-01,0
2021-12-02,1
2021-12-03,2
2021-12-04,3
"""

どうやら最初の1列目に日付データ、2列目にその日の要素が記録されている。

まずは普通に読み込んでみるが、日付の入った1列目のデータをインデックスとしたいので、read_csvの引数index_colでインデックス番号0を指定しインデックスとして保管する。

import pandas as pd

df = pd.read_csv('date.csv', index_col=0)
df.head()
"""
          Value
2021-12-01  0
2021-12-02  1
2021-12-03  2
2021-12-04  3
2021-12-05  4
"""

インデックスの詳細を見てみると、dtypeはobject(文字列)となっている。

print(df.index.dtype)
"""
object
"""

インデックスの型をdatetime型に変換すには以下の方法がある。

df.index = df.index.astype('datetime64[ns]')
# or
df.index = pd.to_datetime(df.index)

print(df.index.dtype)
"""
datetime64[ns]
"""

このようにすればpandasで時系列データとして扱えるようになる。

df.plot(figsize=(10, 5), marker='o')

datetime型に指定した時のread_csvの動作

# ファイルの中身を確認
!head date.csv -n 5
"""
,Value
2021-12-01,0
2021-12-02,1
2021-12-03,2
2021-12-04,3
"""

read_csvの引数index_col=0とした時、parse_dates=Trueを設定すると0番目の列はdatetime型として変換され読み込まれます。

※index_colの0はインデックス番号0番目の日付の入った列を指定している。index_col=1ならば2列目のValueがインデックスと置き換わる。

df_dt = pd.read_csv('date.csv', index_col=0, parse_dates=True)
df_dt.head()
"""
           Value
2021-12-01  0
2021-12-02  1
2021-12-03  2
2021-12-04  3
2021-12-05  4
"""

print(df_dt.index.dtype)
"""
datetime64[ns]
"""

index_colを設定していない場合は、リスト形式でインデックス番号か列名をparse_datesに渡すと変換できる

※Unnamed: 0は列名が無名だった場合に付けられる

df_dt = pd.read_csv('date.csv', parse_dates=[0])
# or
df_dt = pd.read_csv('date.csv', parse_dates=['Unnamed: 0'])
df_dt.head()
"""
    Unnamed: 0  Value
0   2021-12-01  0
1   2021-12-02  1
2   2021-12-03  2
3   2021-12-04  3
4   2021-12-05  4
"""

print(df_dt['Unnamed: 0'].dtype)
"""
datetime64[ns]
"""

列名「Unnamed: 0」から「Date」に変更した列をset_indexを利用して整える。

df_dt = df_dt.rename(columns={'Unnamed: 0': 'Date'}).set_index('Date')
df_dt.head()
"""
            Value
      Date  
2021-12-01  0
2021-12-02  1
2021-12-03  2
2021-12-04  3
2021-12-05  4
"""

print(df_dt.index.dtype)
"""
datetime64[ns]
"""

以上、ご覧いただきありがとうございました。