如何暂时更改/指定用于某些功能调用的区域设置(例如strptime()
)?
我刚刚运行了以下rvest
演示:
demo("tripadvisor", package = "rvest")
当谈到要删除日期的部分时,我遇到了一些很可能是由我的语言环境设置引起的问题:当我使用德语语言环境时,日期采用美国美国格式:< / p>
require("rvest")
url <- "http://www.tripadvisor.com/Hotel_Review-g37209-d1762915-Reviews-JW_Marriott_Indianapolis-Indianapolis_Indiana.html"
reviews <- url %>%
html() %>%
html_nodes("#REVIEWS .innerBubble")
date <- reviews %>%
html_node(".rating .ratingDate") %>%
html_attr("title")
> date
[1] "December 9, 2014" "December 9, 2014" "December 8, 2014" "December 8, 2014"
[5] "December 6, 2014" "December 5, 2014" "December 5, 2014" "December 3, 2014"
[9] "December 3, 2014" "December 3, 2014"
根据此输出,我将使用以下格式:%B %e, %Y
(或%B%e, %Y
取决于“具有一位数字的前导空格”实际上意味着WRT到前导空间;见?strptime
)。
然而,两者都失败了:
strptime(date, "%B %e, %Y")
strptime(date, "%B%e, %Y")
我想这是因为%B
期望月份名称是德语而不是英语:
当前区域设置中的完整月份名称。 (还匹配输入上的缩写名称。)
Sys.setlocale()
让您更改区域设置。但似乎在调用依赖于语言环境设置的函数后,这样做是不可能的。即,您需要从一个新的R会话开始,以便区域设置更改生效。这使得临时更改有点麻烦。任何想法如何解决这个问题?
这是我的语言环境:
> Sys.getlocale(category = "LC_ALL")
[1] "LC_COLLATE=German_Germany.1252;LC_CTYPE=German_Germany.1252;LC_MONETARY=German_Germany.1252;LC_NUMERIC=C;LC_TIME=German_Germany.1252"
当我第一次在运行strptime()
之前更改时,一切正常:
Sys.setlocale(category = "LC_ALL", locale = "us")
> strptime(date, "%B %e, %Y")
[1] "2014-12-09 CET" "2014-12-09 CET" "2014-12-08 CET" "2014-12-08 CET" "2014-12-06 CET"
[6] "2014-12-05 CET" "2014-12-05 CET" "2014-12-03 CET" "2014-12-03 CET" "2014-12-03 CET"
但是,如果我在运行stptime()
后更改,则似乎无法识别更改
> Sys.setlocale(category = "LC_ALL", locale = "German")
[1] "LC_COLLATE=German_Germany.1252;LC_CTYPE=German_Germany.1252;LC_MONETARY=German_Germany.1252;LC_NUMERIC=C;LC_TIME=German_Germany.1252"
> strptime(date, "%B %e, %Y")
[1] "2014-12-09 CET" "2014-12-09 CET" "2014-12-08 CET" "2014-12-08 CET" "2014-12-06 CET"
[6] "2014-12-05 CET" "2014-12-05 CET" "2014-12-03 CET" "2014-12-03 CET" "2014-12-03 CET"
如果更改回德国语言环境,这实际上应该导致NA
s的向量。
答案 0 :(得分:5)
lubridate
包的 parse_date_time()
是您正在寻找的。它有一个显式的locale
选项,用于根据特定的语言环境解析字符串。
parse_date_time(date, orders = "B d, Y", locale = "us")
给你:
[1] "2016-02-26 UTC" "2016-02-26 UTC" "2016-02-26 UTC" "2016-02-24 UTC" "2016-02-23 UTC" "2016-02-21 UTC"
[7] "2016-02-21 UTC" "2016-02-21 UTC" "2016-02-20 UTC" "2016-02-20 UTC"
请注意,您提供的解析格式不会像%
中那样引导strptime()
。