我正在使用Python3+pandas处理一个日语csv文件。
这个日语csv文件有一列表示时间,格式类似于H29.12.1。我了解到这种格式是日本格式,H29.12.1可以转换为2017-12-1(以YYYY-MM-DD格式)。
我的问题是,Python或pandas是否提供将这个日本时间列转换为YYYY-MM-DD格式的函数?
我正在使用Python3+pandas处理一个日语csv文件。
这个日语csv文件有一列表示时间,格式类似于H29.12.1。我了解到这种格式是日本格式,H29.12.1可以转换为2017-12-1(以YYYY-MM-DD格式)。
我的问题是,Python或pandas是否提供将这个日本时间列转换为YYYY-MM-DD格式的函数?
有了这个信息,我们可以读取日期,将年份设置为1989年,并添加N-1,其中N是年份数字(紧跟在H
之后)。
以下是一个示例函数:
import datetime as dt
def parse_heisei(date_string, sep='.'):
y, m, d = date_string.split(sep)
return dt.date(year=1989 + int(y[1:]) - 1, month=int(m), day=int(d))
my_gregorian_dates = df.heisei_dates.apply(parse_hesei)
我相信你也可以找到一个自动执行此操作的库,但我认为标准的datetime模块或pandas没有内置此功能。不管怎样,编写这个功能非常简单。
import re
import pandas as pd
def jp_date_to_yyyymmdd(dt):
if re.match(r'\w\d+\.\d+.\d+', dt) is None:
return None
elif dt[0] == 'H':
# HEISEI - 1989-01-08
ymd = [int(x) for x in re.split(r'\.', dt[1:])]
return pd.datetime(1988 + ymd[0], ymd[1], ymd[2])
elif dt[1] == 'S':
# SHOWA - 1926-12-25
ymd = [int(x) for x in re.split(r'\.', dt[1:])]
return pd.datetime(1925 + ymd[0], ymd[1], ymd[2])
else:
# You may add more conditions to handle older dates
return None
df = pd.DataFrame({'jp_date': ['H29.12.1', 'H20.12.22', '']})
df.jp_date.apply(jp_date_to_yyyymmdd)
如果需要解析包含日本年号的日期,我建议使用更专业的库Japanera。
from japanera import Japanera
janera = Japanera()
# The library outputs dates corresponding to all eras starting with "H",
# as it's somewhat ambiguous which is being referred to
date_candidates = janera.strptime('H29.12.1', '%-a%-o.%m.%d')
# Use max(), with the assumption that the most recent era is the correct one
max(date_candidates)
# => datetime.datetime(2017, 12, 1, 0, 0)
# It can also parse the era names written in Japanese
# (no ambiguity here, so there is only one list item)
janera.strptime('平成29年12月1日', '%-E%-O年%m月%d日')
# => [datetime.datetime(2017, 12, 1, 0, 0)]