Pandas中如何将俄文日月字符串转换为带正确年份的日期格式
俄文疫苗接种数据日期标准化实现方案
放弃英译中转的思路,直接基于原始俄文月份做映射,结合数据倒序排列的特征自动匹配年份,全程无额外依赖,准确率可控。
实现步骤
- 构建俄文月份映射字典
原始数据中俄文月份为第二格固定表述,直接建立和数字月份的一一对应关系,完全规避翻译格式混乱的问题,映射关系如下:ru_month_map = { 'января': 1, 'февраля': 2, 'марта': 3, 'апреля': 4, 'мая': 5, 'июня': 6, 'июля': 7, 'августа': 8, 'сентября': 9, 'октября': 10, 'ноября': 11, 'декабря': 12 } - 拆分原始日期字段
原始date字段固定为[日] [俄文月份]的空格分隔格式,直接拆分提取日、月信息,生成可比较的月日元组,不需要做额外的格式清洗。 - 自动匹配年份
数据按时间倒序排列(最新记录在首行,最早2021年1月的记录在末行),从末行开始逐行向上遍历:- 初始年份设为2021,赋值给最后一行
- 向上逐行对比当前记录和上一条(时间更早的相邻记录)的月日:如果当前月日小于上一条月日,说明出现跨年,年份+1
- 遍历完成后所有记录的年份自动匹配完成,支持跨多年的数据集自动识别
- 格式转换与数据清理
拼接年、月、日生成YYYY-MM-DD标准格式日期,同时清理接种人数字段中的千分位空格,转为可计算的数值类型。
可直接运行的实现代码
基于pandas实现,适配你给出的数据集结构:
import pandas as pd # 俄文月份映射 ru_month_map = { 'января': 1, 'февраля': 2, 'марта': 3, 'апреля': 4, 'мая': 5, 'июня': 6, 'июля': 7, 'августа': 8, 'сентября': 9, 'октября': 10, 'ноября': 11, 'декабря': 12 } # 读取本地数据集,替换为你的文件路径 df = pd.read_csv('vaccine_data.csv') # 拆分日期字段 df[['day', 'month_ru']] = df['date'].str.split(' ', expand=True) df['day'] = df['day'].astype(int) df['month'] = df['month_ru'].map(ru_month_map) df['md_tuple'] = df.apply(lambda x: (x['month'], x['day']), axis=1) # 从最旧记录开始逐行匹配年份 df = df.reset_index(drop=True) current_year = 2021 year_list = [0]*len(df) year_list[-1] = current_year prev_md = df.loc[len(df)-1, 'md_tuple'] for i in range(len(df)-2, -1, -1): current_md = df.loc[i, 'md_tuple'] if current_md < prev_md: current_year += 1 year_list[i] = current_year prev_md = current_md df['year'] = year_list # 生成标准格式日期 df['date'] = pd.to_datetime(df[['year', 'month', 'day']]).dt.strftime('%Y-%m-%d') # 清理中间列,处理数值字段的千分位空格 df = df.drop(columns=['day', 'month_ru', 'month', 'md_tuple', 'year']) for col in ['vaccinated person', 'fully vaccinated person']: df[col] = df[col].astype(str).str.replace(' ', '').astype('Int64') # 打印首尾行验证结果 print(df.head()) print(df.tail())
如果后续数据更新新增了2023年及以后的记录,不需要修改代码逻辑,遍历过程会自动识别跨年点完成年份匹配。
内容的提问来源于stack exchange,提问作者kostya ivanov
相关产品推荐
相关产品推荐

