我在我的包的功能中使用strptime(...)
。我需要使用特定的本地设置解析字符串,并使用Sys.setlocale
作为解决方法来获取英语本地化设置。为减少副作用,之后恢复先前的本地设置。
该函数的基本代码片段如下所示:
#parameter settings
sometext <- "Mon, 14 Mar 2011 23:42:16 GMT"
timeFormat <- "%a, %d %b %Y %H:%M:%S"
timeZone <- "GMT"
#get current locale
loc <- Sys.getlocale("LC_TIME")
#set british localization
dummy <- Sys.setlocale("LC_TIME", "en_GB.UTF-8")
#parse datetime string
time <- strptime(sometext, format = timeFormat, tz= timeZone)
#set local back
dummy <- Sys.setlocale("LC_TIME", loc)
不幸的是,我的同事在使用此功能时会收到以下警告:
In Sys.setlocale("LC_TIME", "en_GB.UTF-8") :
OS reports request to set locale to "en_GB.UTF-8" cannot be honored
在我的电脑上一切正常。 是否有更好的(并且独立于已安装的R本地化)执行此任务的方式?通常我想使用strptime,因为它允许非常灵活地解析日期时间字符串。
答案 0 :(得分:11)
我很确定你学院的电脑上没有安装“en_GB.UTF-8”语言环境。最简单的方法就是安装它:)嗯,这对每个操作系统来说都是微不足道的。
其他选项可以是使用可在每台计算机上找到的标准区域设置。由于您添加的示例没有显示特殊格式,您可以尝试将LC_TIME
设置为C
,这也适用于Linux和Windows。使用该语言环境,您的示例将像魅力一样工作。参见:
> Sys.setlocale("LC_TIME", "C")
> strptime("Mon, 14 Mar 2011 23:42:16 GMT", format = "%a, %d %b %Y %H:%M:%S", tz="GMT")
[1] "2011-03-14 23:42:16 GMT"
或者您应该转换您的数据 - 例如:编写一个简短的函数将所有周和月的名称替换为标准字符串,并将导入的字符串重组为标准字符串。
答案 1 :(得分:1)
我在Windows机器上尝试过你的代码并得到同样的错误。供参考,Sys.getlocale(“LC_TIME”)的结果:
> Sys.getlocale("LC_TIME")
[1] "English_United Kingdom.1252"
我怀疑这可能是一个相当标准的语言环境。
但我也怀疑处理这个问题的更好方法是使用包lubridate中的一些函数,这样可以很容易地处理日期。
你没有在你的问题中提供足够的细节你要做什么,但我猜测“sometext”是特定的预期格式,例如DMY或YMD。 Lubridate提供了以任何指定格式解析日期的功能,例如dmy(),ymd(),mdy() - 你得到了图片。
如果您提供有关真实问题的更多详细信息,我们可能会提供更具体的帮助。