【问题标题】:Temporarily change locale settings临时更改区域设置
【发布时间】:2014-12-10 10:38:52
【问题描述】:

实际问题

我如何临时更改/指定用于某些函数调用的区域设置(例如strptime())?

背景

我刚刚运行了以下rvest 演示:

demo("tripadvisor", package = "rvest")

当涉及到要抓取日期的部分时,我遇到了一些很可能是由我的语言环境设置引起的问题:日期是美国格式,而我在德国语言环境中:

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"

如果已执行更改回德语区域设置,这实际上应该产生NAs 的向量。

【问题讨论】:

  • 使用Sys.getlocale()Sys.setlocale()。见?locales
  • 谢谢,我也看到了。但是区域设置的更改似乎仅在调用任何依赖它的函数之前才起作用。所以这几乎排除了临时更改,对吧?知道如何解决这个问题吗?
  • 你能把它变成一个可重现的例子吗?
  • 我忘记了reviews的计算。现在应该可以重现了。

标签: r locale strptime


【解决方案1】:

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() 中一样。

【讨论】:

    【解决方案2】:

    你也可以在readr::parse_date()中使用readr::locale("en")

      readr::parse_date(date, format = "%B %e, %Y", 
                  # vector of strings to be interpreted as missing values:
                    na = c("", "NA"), 
                    locale = readr::locale("en"), 
                  # to trim leading and trailing whitespaces:
                    trim_ws = TRUE)
    

    来自文档:“语言环境控制的默认设置因地而异。默认语言环境以美国为中心(如 R),但您可以使用 locale() 创建自己的语言环境来控制诸如默认时区、编码、小数点、大号和日/月名称。"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-13
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多