pandasで日付データを変換

やっぱり細かいこともちゃんとメモしようと思った今日この頃の俺だ〜

やりたいこと

  1. pandas内にstr型のyyyy年mm月dd日として入力されている値を、 datetype型のyyyy-mm-ddとして変換する

  2. datetype型の変数から、日付のみ(時間とかいらないい)を取り出す

  3. 日付を昇順にソート

  4. 日付をインデックスへ

参考記事

pandas.DataFrame, Seriesを時系列データとして処理 | note.nkmk.me

使うデータ

下のようなpandasのデータフレーム pandaspandas.read_csvで読み込んだものを使用

読み込む過程は省略

このデータフレームのDate列の値をdatetype型へ変換する

df0=pd.read_csv(filepath,encoding="utf-8",usecols=['日付け','終値']) df1=df0.rename(columns={'日付け': 'Date','終値': filename}) print (df1) 
             Date  AUDJPY
0     2020年03月09日   67.43
1     2020年03月08日   68.74
2     2020年03月06日   70.06
3     2020年03月05日   70.22
4     2020年03月04日   71.26
...           ...     ...
3957  2005年01月07日   79.36
3958  2005年01月06日   79.88
3959  2005年01月05日   79.55
3960  2005年01月04日   80.18
3961  2005年01月03日   79.88

やること

変換するデータの型を確認する

まずは変換するデータの型を確認する、これ鉄則。多分。

df0=pd.read_csv(filepath,encoding="utf-8",usecols=['日付け','終値']) df1=df0.rename(columns={'日付け': 'Date','終値': filename}) 
print (df1.dtypes) 
print (type(df1['Date'][0])) 
Date       object
AUDJPY    float64
dtype: object
<class 'str'>

調べてみたところ、object型はpandasでの型でstrはpythonの型?なのか? よくわからん、、

ってか、こういうデータの型ってよくわからないけど、調べた結果べたうちすればうまく行ったりするから、そのまま理解せず放置しがち

ググる&実行

上の参考サイトが出てきた

df0=pd.read_csv(filepath,encoding="utf-8",usecols=['日付け','終値']) df1=df0.rename(columns={'日付け': 'Date','終値': filename}) df1['Date']=pd.to_datetime(df1['Date'],format='%Y年%m月%d日') 
print (df1) 
print (df1.dtypes) 
print (type(df1['Date'][0])) 
           Date  AUDJPY
0    2020-03-09   67.43
1    2020-03-08   68.74
2    2020-03-06   70.06
3    2020-03-05   70.22
4    2020-03-04   71.26
...         ...     ...
3957 2005-01-07   79.36
3958 2005-01-06   79.88
3959 2005-01-05   79.55
3960 2005-01-04   80.18
3961 2005-01-03   79.88

時間とかを消す

df0=pd.read_csv(filepath,encoding="utf-8",usecols=['日付け','終値']) df1=df0.rename(columns={'日付け': 'Date','終値': filename}) df1['Date']=pd.to_datetime(df1['Date'],format='%Y年%m月%d日') 
print (df1['Date'][0]) print (type(df1['Date'][0])) 
df1['Date'] = df1['Date'].dt.date # 日付のみ抽出 
print (df1['Date'][0]) 
print (type(df1['Date'][0])) 
2020-03-09 00:00:00
<class 'pandas._libs.tslibs.timestamps.Timestamp'>
2020-03-09
<class 'datetime.date'>

昇順にソート&インデックスへ

df=df.sort_values(['Date'])#日付順にソート
df=df.set_index('Date')#indexへ
            Date  AUDJPY      AXJO   CLJ0  ...   JGBM0       N225  USDJPY    USM0
0     2020-03-09   67.43  5,760.60  30.95  ...  155.88  19,698.76  102.36  184.09
1     2020-03-06   70.06  6,216.20  41.28  ...  154.64  20,749.75  105.31  180.97
2     2020-03-05   70.22  6,395.70  45.90  ...  153.91  21,329.12  106.17  174.94
3     2020-03-04   71.26  6,325.40  46.78  ...  154.15  21,100.06  107.53  173.41
4     2020-03-03   70.53  6,435.70  47.18  ...  153.76  21,082.73  107.14  173.31
...          ...     ...       ...    ...  ...     ...        ...     ...     ...
2553  2009-01-28   60.17  3,495.50  42.16  ...  139.03   8,106.29   90.50  128.92
2554  2009-01-27   58.93  3,444.00  41.58  ...  139.01   8,061.07   89.35  131.20
2555  2009-01-23   58.25  3,342.70  46.47  ...  139.81   7,745.25   89.62  129.61
2556  2009-01-22   58.22  3,486.80  43.67  ...  139.64   8,051.74   89.15  129.94
2557  2009-01-21   59.39  3,442.80  43.55  ...  139.65   7,901.64   89.08  131.66

[2558 rows x 13 columns]
            AUDJPY      AXJO   CLJ0  ...       N225  USDJPY    USM0
Date                                 ...                           
2009-01-21   59.39  3,442.80  43.55  ...   7,901.64   89.08  131.66
2009-01-22   58.22  3,486.80  43.67  ...   8,051.74   89.15  129.94
2009-01-23   58.25  3,342.70  46.47  ...   7,745.25   89.62  129.61
2009-01-27   58.93  3,444.00  41.58  ...   8,061.07   89.35  131.20
2009-01-28   60.17  3,495.50  42.16  ...   8,106.29   90.50  128.92
...            ...       ...    ...  ...        ...     ...     ...
2020-03-03   70.53  6,435.70  47.18  ...  21,082.73  107.14  173.31
2020-03-04   71.26  6,325.40  46.78  ...  21,100.06  107.53  173.41
2020-03-05   70.22  6,395.70  45.90  ...  21,329.12  106.17  174.94
2020-03-06   70.06  6,216.20  41.28  ...  20,749.75  105.31  180.97
2020-03-09   67.43  5,760.60  30.95  ...  19,698.76  102.36  184.09

[2558 rows x 12 columns]

まとめ

困ったらググる

最後にコード

実際はフォルダ内のcsvファイルを読み込んで、一つのデータフレームに結合する処理もしていたので、こんな感じになった

import glob
import pandas as pd
from dateutil.relativedelta import relativedelta
import numpy as np
import scipy.optimize as sco
import sys
import matplotlib.pyplot as plt
import os

l=glob.glob('data/*.csv')#dataディレクトリ直下のcsvファイル読み込み

df=pd.DataFrame([])
#各ファイルのデータを1つのデータフレームへ結合
for idx,filepath in enumerate(l):
    filename0=os.path.basename(filepath)
    filename=os.path.splitext(filename0)[0]

    df0=pd.read_csv(filepath,encoding="utf-8",usecols=['日付け','終値'])
    df1=df0.rename(columns={'日付け': 'Date','終値': filename})

#    if filename=='DJI':
#        print (df1)
#        sys.exit()

    df1['Date']=pd.to_datetime(df1['Date'],format='%Y年%m月%d日')
    df1['Date'] = df1['Date'].dt.date  # 日付のみ抽出

    if idx==0:
        df=df1
    else:
        df=pd.merge(df,df1,on='Date')

df=df.sort_values(['Date'])#日付順にソート
df=df.set_index('Date')#indexへ