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

R语言使用hms库解析西里尔字母日期报错怎么解决?

R环境下解析西里尔字母日期失败的解决方案

问题描述

  • 使用R环境的hms库解析多语言日期时,英语、德语、法语等拉丁字母语言的日期可正常解析,示例代码如下:
parse_date("1 Januar 2015", "%d %B %Y", locale = locale("de"))
# 返回结果:[1] "2015-01-01"
  • 解析乌克兰语(uk)、俄语(ru)、保加利亚语(bg)、白俄罗斯语(by)等使用西里尔字母的语言日期时,会出现解析失败返回NA的错误,报错示例如下:
parse_date("1 січня  2015", "%d %B %Y", locale = locale("uk"))
# 警告信息:1 parsing failure.
# row col           expected                           actual
# 1  -- date like %d %B %Y 1 <f1><U+00B3><f7><ed><ff>  2015
# 返回结果:[1] NA

另一错误示例:

parse_date("31 януари 2011","%d %B %Y",locale=locale("bg"))
# 警告信息:1 parsing failure.
# row col           expected                           actual
# 1  -- date like %d %B %Y 31 <ff><ed><f3><e0><f0><e8> 2011
# 返回结果:[1] NA
  • 经排查,对应语言的date_names配置正常存在,保加利亚语配置示例如下:
date_names_lang("bg")
# 返回结果:
# <date_names>
# Days:   неделя (нд), понеделник (пн), вторник (вт), сряда (ср), четвъртък (чт), петък
# (пт), събота (сб)
# Months: януари (ян.), февруари (февр.), март (март), април (апр.), май (май), юни (юни),
# юли (юли), август (авг.), септември (септ.), октомври (окт.), ноември
# (ноем.), декември (дек.)
# AM/PM:  пр.об./сл.об.

已验证可行解决方案(Windows系统)

问题根源为西里尔字母日期字符串的编码不匹配,使用iconv将编码从Windows-1251转换为UTF-8后即可正常解析,示例代码如下:

# 保加利亚语日期解析
date_test <- iconv("1 януари 2021","Windows-1251","UTF-8")
date_test
# [1] "1 януари 2021"
parse_date(date_test, "%d %B %Y", locale = locale("bg"))
# [1] "2021-01-01"

# 乌克兰语日期解析
date_test <- iconv("1 січня 2021","Windows-1251","UTF-8")
date_test
# [1] "1 січня 2021"
parse_date(date_test, "%d %B %Y", locale = locale("uk"))
# [1] "2021-01-01"

# 俄语完整月份名日期解析
date_test <- iconv("1 января 2021","Windows-1251","UTF-8")
date_test
# [1] "1 января 2021"
parse_date(date_test, "%d %B %Y", locale = locale("ru"))
# [1] "2021-01-01"

# 俄语缩写月份名日期解析
date_test <- iconv("1 янв. 2021","Windows-1251","UTF-8")
date_test
# [1] "1 янв. 2021"
parse_date(date_test, "%d %b %Y", locale = locale("ru"))
# [1] "2021-01-01"

其他可选优化方案

  • 批量处理文件时,可在读取数据源阶段直接指定编码为Windows-1251,避免后续逐行转换编码,例如使用readr系列函数时传入locale = locale(encoding = "Windows-1251")参数即可
  • Linux/macOS系统下可直接将系统区域设置为对应西里尔语言的UTF-8编码,无需额外转换即可直接解析

内容的提问来源于stack exchange,提问作者manro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:12:02