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
相关产品推荐
相关产品推荐

