pandasで日付データを変換
やっぱり細かいこともちゃんとメモしようと思った今日この頃の俺だ〜
やりたいこと
pandas
内にstr型のyyyy年mm月dd日として入力されている値を、 datetype型のyyyy-mm-ddとして変換するdatetype型の変数から、日付のみ(時間とかいらないい)を取り出す
日付を昇順にソート
日付をインデックスへ
参考記事
pandas.DataFrame, Seriesを時系列データとして処理 | note.nkmk.me
使うデータ
下のようなpandas
のデータフレーム pandas
のpandas.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へ