はじめに
巷には未だに和暦のcsvデータが溢れています。
和暦のcsvデータをreadして、いい感じに西暦なdataframeにしたいと思っている人への備忘です。
(parserを修正しました)
結論
整形前
"年月日","メモ"
R03.05.15,"メモ1"
R03.06.04,"メモ2"
整形後
date memo
0 2021-05-15 メモ1
1 2021-06-04 メモ2
コード
import pandas as pd
from datetime import datetime
def read_wareki_csv(csv_filename):
df = pd.read_csv(csv_filename, header=None, names=['date', 'memo'], skiprows=1, parse_dates=[0], date_parser=wareki_parser)
return df
def wareki_parser(date):
wareki = {
"R":2018,
"H":1988
}
date = str(int(date[1:3])+wareki[date[0]])+date[3:9]
dt = datetime.strptime(date, '%Y.%m.%d')
return dt
if __name__ == '__main__':
df = read_wareki_csv("./input.csv")
print(df)
解説
read_csv
def read_wareki_csv(csv_filename):
df = pd.read_csv(csv_filename, header=None, names=['date', 'memo'], skiprows=1, parse_dates=[0], date_parser=wareki_parser)
return df
pandasのread_csvには、便利なオプションとして、指定のcolumnをdatetime型で読み込むparse_dates
と、parse_dates
で指定したcolumnを処理するparserを指定するdate_parser
があります。
parse_dates
にはlistとかdictとかを指定しましょう。ここをparse_dates=0
とかにすると、TypeError: Only booleans, lists, and dictionaries are accepted for the 'parse_dates' parameter
と怒られます。
date_parser
には自作関数を指定します。この自作関数の中で和暦→西暦変換を書いてあげましょう。
今回は、令和と平成の両方に対応する感じでやります。
parser(修正)
当初、datetime.strptime(date, 'R%y.%m.%d')
という感じで年の下2桁をそのまま読み込んでから年数を加算する方式で書いていましたが、閏年でエラーとなるとご指摘をいただいたため、普通に文字列操作でやることにしました。。そりゃそうですよね・・・。
def wareki_parser(date):
wareki = {
"R":2018,
"H":1988
}
date = str(int(date[1:3])+wareki[date[0]])+date[3:9]
dt = datetime.strptime(date, '%Y.%m.%d')
return dt
なお、今回は令和と平成のみにしましたが、同様に昭和等も対応可能です。
皆様、素敵な和暦データ処理をお楽しみください。