4

我希望将挪威语中的一些日期转换为 R 中的实际日期。我正在使用readr,并且它有点工作 - 但我偶然发现了一个真正让我烦恼的问题,我真的不知道如何解决它。这是我的问题的说明:

> parse_date(c("29. mai 2017", "29. sep 2017"), format = "%d. %b %Y", locale = locale("nn")) 
Warning: 1 parsing failure.
row # A tibble: 1 x 4 col     row   col expected            actual       expected   <int> <int> <chr>               <chr>        actual 1     2    NA date like %d. %b %Y 29. sep 2017
[1] "2017-05-29" NA          

所以它捕捉到了 5 月的日期,但没有捕捉到 9 月的日期。原来这是因为挪威语中九月的缩写需要一个“。” (sep.而不是sep),而 May 的缩写没有(可能是因为它实际上不是缩写 ;-)):

locale("nb")
<locale>
Numbers:  123,456.78
Formats:  %AD / %AT
Timezone: UTC
Encoding: UTF-8
<date_names>
Days:   søndag (søn.), mandag (man.), tirsdag (tir.), onsdag (ons.), torsdag(tor.), fredag (fre.), lørdag (lør.)
Months: januar (jan.), februar (feb.), mars (mar.), april (apr.), mai (mai), juni (jun.), juli (jul.), august (aug.), september (sep.), oktober (okt.), november (nov.), desember (des.)
AM/PM:  a.m./p.m.

然而,这似乎是不一致的,它不需要所有月份的承租人数量相同。我也注意到了这些烦人的“。” 不是英语缩写的一部分:

> locale("en")
<locale>
Numbers:  123,456.78
Formats:  %AD / %AT
Timezone: UTC
Encoding: UTF-8
<date_names>
Days:   Sunday (Sun), Monday (Mon), Tuesday (Tue), Wednesday (Wed), Thursday (Thu), Friday (Fri), Saturday (Sat)
Months: January (Jan), February (Feb), March (Mar), April (Apr), May (May), June (Jun), July (Jul), August (Aug),
    September (Sep), October (Oct), November (Nov), December (Dec)
AM/PM:  AM/PM

这真的很不方便,因为我相信实际上包含“。”有点罕见。当注册日期带有缩写时(但这实际上只是基于个人喜好和经验)。非常感谢任何输入。

4

2 回答 2

1

您可以像这样手动编辑语言环境...

loc <- locale("nb")

loc$date_names$mon_ab <- substr(loc$date_names$mon_ab, 1, 3) #just take first 3 characters

parse_date(c("29. mai 2017", "29. sep 2017"), format = "%d. %b %Y", locale = loc)

[1] "2017-05-29" "2017-09-29"
于 2018-06-15T11:47:48.247 回答
0

与@Andrew Gustar 类似并受到启发的解决方案是创建您自己的 date_names 对象:

loc <- locale("nb")
myNo <- date_names(mon = loc$date_names$mon,
                   mon_ab = substr(loc$date_names$mon_ab, 1, 3),
                   day = loc$date_names$day,
                   day_ab = substr(loc$date_names$day, 1, 3))


parse_date(c("29. mai 2017", "29. sep 2017"), format = "%d. %b %Y", locale = locale(date_names = myNo))

[1] "2017-05-29" "2017-09-29"
于 2018-06-15T12:32:46.763 回答