【问题标题】:Mysterious error by parsing French dates on OSX在 OSX 上解析法语日期的神秘错误
【发布时间】:2013-07-25 11:13:14
【问题描述】:

我有一个带有法语日期的字符向量。我想将它们转换为 R 中的日期格式。它似乎有效,但有一些神秘的错误。例如,R 识别“30 juin 2012”但不识别“30 juillet 2012”:

> as.Date("30 juin 2012", format = "%d %B %Y")
[1] "2012-06-30"
> as.Date("28 février 2012", format = "%d %B %Y")
[1] "2012-02-28"
> as.Date("30 juillet 2012", format = "%d %B %Y")
[1] NA

你有什么解释吗?

PS : 我的本地设置是法语 UTF8

> Sys.getlocale()
[1] "fr_FR.UTF-8/fr_FR.UTF-8/fr_FR.UTF-8/C/fr_FR.UTF-8/fr_FR.UTF-8"

【问题讨论】:

  • 嗯。当我做Sys.setlocale(locale="fr_FR.UTF-8") 时,你所有的代码都对我有用。 (我没有法语语言包,而且我在 Linux 上,所以我先运行 sudo locale-gen fr_FR.UTF-8,然后运行 ​​sudo dpg-reconfigure locales)。也许尝试使用小写的%b 而不是%B?你的操作系统是什么?
  • 通过将我的语言环境设置为法语,您的所有代码也适用于我。 format(as.Date(c("2000-06-01", "2000-07-01")), "%B") 的输出是什么?
  • @GSee :我在 Mac OS 10.8 上,使用 %b 而不是 %B 得到了相同的结果
  • @dickoa :好主意,但我仍然没有看到问题:> format(as.Date(c("2000-06-01", "2000-07-01")), "%B") [1] "juin" "juillet"

标签: r date


【解决方案1】:

我真的没有解释,但我有一个解决方案。使用“,”而不是“。”的德国数字有类似的问题。对于小数和一些不同的日期书写方式。以下是我通常对格式不正确的数据执行的操作:

a<-"30 juillet 2012"

b<-gsub(pattern="juillet", a, replacement="july")

as.Date(b, format="%d %B %Y")
[1] "2012-07-30"

希望这对您有所帮助。如果“七月”在您的系统上不起作用,您可以随时将其替换为 7。就像这样

a<-"30 juillet 2012"
b<-gsub(pattern="juillet", a, replacement="/ 7 /")
b<-gsub(pattern="|| ", b, replacement="")
as.Date(b, format= "%d/%m/%Y")

你好,本

【讨论】:

  • @Ben_K 感谢您的解决方案。我可以这样做,但我想了解为什么标准解决方案不起作用。
【解决方案2】:

正如 GSee 所说,这是一个语言环境问题。使用Sys.setlocale 将您的语言环境设置为法语,您的代码示例运行正常。

在 Linux 下(我也认为是 OS X,但未测试):

Sys.setlocale(locale="fr_FR")

在 Windows 下:

Sys.setlocale(locale="French_France")

GSee 注释中的UTF-8是字符编码,是可选的。请参阅?iconvlist 了解更多信息。

【讨论】:

  • 还是不行:&gt; Sys.setlocale(locale="fr_FR") [1] "fr_FR/fr_FR/fr_FR/C/fr_FR/fr_FR.UTF-8" &gt; as.Date("5 juillet 2011", format = "%d %B %Y") [1] NA
  • 而 juillet(7 月)似乎是唯一一个未被as.Date() 识别的月份
  • +1 我也可以通过切换语言环境很好地返回日期(包括 juillet)
  • @SimonO101 你不是在 OS X 上吗?
  • @GSee 不,我在工作并且在 Windows x64 上。我家里有一台可以测试的 Mac
【解决方案3】:

在“OSX strptime juillet”上进行一些谷歌搜索会产生来自 Peter Dalgaard http://grokbase.com/t/r/r-sig-mac/12696r26eh/as-date-does-not-work-with-format-b 的评论:

好像是这样的

http://lists.freebsd.org/pipermail/freebsd-bugs/2009-December/037796.html

在 2010 年 5 月修复,但显然还没有渗透到 OSX 更新了。 (仍然存在于 Lion 的本地构建中,所以不仅仅是 CRAN 二进制文件。插入适当的关于开源和 商业供应商在这里...)

错误总结:带 %B 的 strptime 历经数月并检查 为全名,然后是缩写。问题是“juillet”的“jui” 匹配缩写。为“君”!但是“llet”与 %Y 不匹配,我们得到了 NA。

所以这是一个在 OSX 中持续存在的 BSD 错误。

看起来您将不得不使用类似@Ben K 的解决方案来解决此问题。 (对不起。)

【讨论】:

    【解决方案4】:

    (已经发布了“为什么?”和“如何回答”的答案。因此,即使它不是 OSX 上的补丁,也可以将其保留为似乎是“深入”的解释。而且它是OSX 中的错误,而不是 R。)

    尽管将我的语言环境(也在 Mac 上)设置为“fr_FR”,但 LC_TIME 设置仍然是“en_US”

    > Sys.getlocale()
    [1] "en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8"
    > Sys.setlocale(locale="fr_FR") # Should have category="LC_ALL"
    [1] "fr_FR/fr_FR/fr_FR/C/fr_FR/en_US.UTF-8"
    > month.abb
     [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
    > month.name
     [1] "January"   "February"  "March"     "April"     "May"       "June"      "July"     
     [8] "August"    "September" "October"   "November"  "December" 
    

    阅读 lubridate 的 Github 错误后,我似乎没有报告任何新内容。我猜Mac有这个错误。帮助页面说“month.abb”和“month.name”值应该用作参考,但更改它们也是无效的。 (也许他们是在 Startup 上读到的?)已经在 SIG-R-Mac 上报道过:http://markmail.org/search/?q=+list%3Aorg.r-project.r-sig-mac+french+locale#query:%20list%3Aorg.r-project.r-sig-mac%20french%20locale+page:1+mid:oie7r5qksadmzjia+state:results

    然后继续阅读,我们发现该错误存在于 OSX 中并且已经存在了一段时间: http://lists.freebsd.org/pipermail/freebsd-bugs/2009-December/037796.html

    我只在 Lion 上,但“现在很快”会更新到 Mavericks。

    【讨论】:

    • 我认为这一个答案,因为问题是“你有什么解释吗?” (解决方法的奖励积分)。 (这与我的回答基本相同)。
    • 是的,一样。你用谷歌。我使用了 Markmail。他得到了解决方法。
    猜你喜欢
    • 2016-01-17
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多