如何将含西里尔文月份的日期字符串转为年月日格式整数
解决西里尔文日期转YYYYMMDD整数的问题
看起来你遇到的核心问题是西里尔文月份无法被标准日期解析工具识别,而且需要调整日期格式的顺序。下面我分Python和SQL两种常用场景给你实用的解决方案:
方案一:Python预处理(适合数据清洗阶段)
Python的datetime模块默认不支持西里尔文月份,我们可以手动建立月份映射表,拆分字符串后重新组合成目标格式:
# 俄语日期里的月份是属格形式,确保映射表拼写和数据源完全一致 cyrillic_month_map = { 'января': '01', 'февраля': '02', 'марта': '03', 'апреля': '04', 'мая': '05', 'июня': '06', 'июля': '07', 'августа': '08', 'сентября': '09', 'октября': '10', 'ноября': '11', 'декабря': '12' } def convert_cyrillic_date(date_str): # 拆分日期字符串:比如'25 февраля 2018'拆分为['25', 'февраля', '2018'] day, cyr_month, year = date_str.split() # 替换成两位数字月份,日期补零确保个位数日期格式正确 month = cyrillic_month_map[cyr_month] formatted_date = f"{year}{month}{day.zfill(2)}" return int(formatted_date) # 测试示例 print(convert_cyrillic_date('25 февраля 2018')) # 输出:20180225 print(convert_cyrillic_date('5 марта 2019')) # 输出:20190305
方案二:SQL直接转换(适合数据库内提取计算)
1. MySQL 实现
MySQL默认不识别西里尔文月份,我们可以用CASE语句做映射,再拼接成目标格式:
SELECT CAST( CONCAT( SUBSTRING_INDEX(date_col, ' ', -1), -- 提取年份 CASE SUBSTRING_INDEX(SUBSTRING_INDEX(date_col, ' ', 2), ' ', -1) WHEN 'января' THEN '01' WHEN 'февраля' THEN '02' WHEN 'марта' THEN '03' WHEN 'апреля' THEN '04' WHEN 'мая' THEN '05' WHEN 'июня' THEN '06' WHEN 'июля' THEN '07' WHEN 'августа' THEN '08' WHEN 'сентября' THEN '09' WHEN 'октября' THEN '10' WHEN 'ноября' THEN '11' WHEN 'декабря' THEN '12' END, LPAD(SUBSTRING_INDEX(date_col, ' ', 1), 2, '0') -- 提取日期并补零 ) AS UNSIGNED) AS ymd_date_int FROM your_table;
2. PostgreSQL 实现
可以创建自定义函数来简化转换逻辑:
CREATE OR REPLACE FUNCTION cyrillic_to_ymd(date_str TEXT) RETURNS INTEGER AS $$ DECLARE month_map JSONB := '{"января": "01", "февраля": "02", "марта": "03", "апреля": "04", "мая": "05", "июня": "06", "июля": "07", "августа": "08", "сентября": "09", "октября": "10", "ноября": "11", "декабря": "12"}'::JSONB; parts TEXT[] := string_to_array(date_str, ' '); BEGIN RETURN CAST(parts[3] || (month_map->>parts[2]) || lpad(parts[1], 2, '0') AS INTEGER); END; $$ LANGUAGE plpgsql; -- 使用示例 SELECT cyrillic_to_ymd('25 февраля 2018'); -- 返回:20180225
为什么直接转Date类型会返回NULL?
标准日期解析工具(不管是Python还是SQL)默认只支持系统语言环境中的月份名称,而你的系统大概率不是俄语环境,因此无法识别西里尔文月份,导致解析失败返回NULL。手动建立月份映射表是最直接可靠的解决方式。
内容的提问来源于stack exchange,提问作者Denis Evseev
相关产品推荐
相关产品推荐

