You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas中如何将俄文日月字符串转换为带正确年份的日期格式

俄文疫苗接种数据日期标准化实现方案

放弃英译中转的思路,直接基于原始俄文月份做映射,结合数据倒序排列的特征自动匹配年份,全程无额外依赖,准确率可控。

实现步骤

  • 构建俄文月份映射字典
    原始数据中俄文月份为第二格固定表述,直接建立和数字月份的一一对应关系,完全规避翻译格式混乱的问题,映射关系如下:
    ru_month_map = {
        'января': 1,
        'февраля': 2,
        'марта': 3,
        'апреля': 4,
        'мая': 5,
        'июня': 6,
        'июля': 7,
        'августа': 8,
        'сентября': 9,
        'октября': 10,
        'ноября': 11,
        'декабря': 12
    }
    
  • 拆分原始日期字段
    原始date字段固定为[日] [俄文月份]的空格分隔格式,直接拆分提取日、月信息,生成可比较的月日元组,不需要做额外的格式清洗。
  • 自动匹配年份
    数据按时间倒序排列(最新记录在首行,最早2021年1月的记录在末行),从末行开始逐行向上遍历:
    1. 初始年份设为2021,赋值给最后一行
    2. 向上逐行对比当前记录和上一条(时间更早的相邻记录)的月日:如果当前月日小于上一条月日,说明出现跨年,年份+1
    3. 遍历完成后所有记录的年份自动匹配完成,支持跨多年的数据集自动识别
  • 格式转换与数据清理
    拼接年、月、日生成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 19:06:43