LoginSignup
1
4

More than 1 year has passed since last update.

pandasのdataframeで和暦を西暦に変換する

Last updated at Posted at 2021-06-10

はじめに

巷には未だに和暦のcsvデータが溢れています。
和暦のcsvデータをreadして、いい感じに西暦なdataframeにしたいと思っている人への備忘です。
(parserを修正しました)

結論

整形前

input.csv
"年月日","メモ"
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

なお、今回は令和と平成のみにしましたが、同様に昭和等も対応可能です。
皆様、素敵な和暦データ処理をお楽しみください。

1
4
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4