请参阅下面的代码,我必须更改我的区域设置才能转换日期。我的第一次尝试是不成功的,我的第二次尝试是有效的,虽然它似乎是多余的,并没有改变Sys.getlocale
的输出。
我的操作系统是Windows 7 64位
Sys.getlocale() # "LC_COLLATE=French_Belgium.1252;LC_CTYPE=French_Belgium.1252;LC_MONETARY=French_Belgium.1252;LC_NUMERIC=C;LC_TIME=French_Belgium.1252"
date <- "Dec-11"
as.Date(date, format = "%b-%d") # NA
Sys.setlocale(locale = "UK") # "LC_COLLATE=English_United Kingdom.1252;LC_CTYPE=English_United Kingdom.1252;LC_MONETARY=English_United Kingdom.1252;LC_NUMERIC=C;LC_TIME=English_United Kingdom.1252"
locale2 <- Sys.getlocale()
as.Date(date, format = "%b-%d") # NA
Sys.setlocale("LC_TIME", "English_United Kingdom")
locale3 <- Sys.getlocale() # "LC_COLLATE=English_United Kingdom.1252;LC_CTYPE=English_United Kingdom.1252;LC_MONETARY=English_United Kingdom.1252;LC_NUMERIC=C;LC_TIME=English_United Kingdom.1252"
as.Date(date, format = "%b-%d") # "2017-12-11"
locale2 == locale3 # TRUE
我可以跳过对Sys.getlocale
的第一次通话,日期转换将有效:
Sys.getlocale() # "LC_COLLATE=French_Belgium.1252;LC_CTYPE=French_Belgium.1252;LC_MONETARY=French_Belgium.1252;LC_NUMERIC=C;LC_TIME=French_Belgium.1252"
date <- "Dec-11"
as.Date(date, format = "%b-%d") # NA
Sys.setlocale("LC_TIME", "English_United Kingdom") #
locale4 <- Sys.getlocale() # "LC_COLLATE=French_Belgium.1252;LC_CTYPE=French_Belgium.1252;LC_MONETARY=French_Belgium.1252;LC_NUMERIC=C;LC_TIME=English_United Kingdom.1252"
as.Date(date, format = "%b-%d") # "2017-12-11"
但这不起作用:
Sys.getlocale() # "LC_COLLATE=French_Belgium.1252;LC_CTYPE=French_Belgium.1252;LC_MONETARY=French_Belgium.1252;LC_NUMERIC=C;LC_TIME=French_Belgium.1252"
date <- "Dec-11"
as.Date(date, format = "%b-%d") # NA
Sys.setlocale(locale = "English_United Kingdom") #
locale5 <- Sys.getlocale() # "LC_COLLATE=English_United Kingdom.1252;LC_CTYPE=English_United Kingdom.1252;LC_MONETARY=English_United Kingdom.1252;LC_NUMERIC=C;LC_TIME=English_United Kingdom.1252"
as.Date(date, format = "%b-%d") # NA
这与此问题有关:Converting integer format date to double format of date
答案 0 :(得分:0)
根据answer of prof. dr. Brian Ripley:
这是Windows中的预期行为。在其他系统上,格式化range = 1..999
multiple_of_3_or_5? = fn(n) -> (rem(n, 3) == 0 || rem(n, 5) == 0) end
for n <- range, multiple_of_3_or_5?.(n) do n end |> Enum.reduce(0,
fn(x, acc) -> x + acc end)
的基础函数使用特定于操作系统的strptime函数,但Windows没有。因此,在非英语日或月名的情况下,R使用替代函数。由于您在法语中使用标准语言环境,因此您的R设置为识别法语日期和月份名称/缩写。
strptime的这个替换函数使用它自己的日期和月份名称的映射,但只有在专门设置range = 1..999
multiple_of_3_or_5? = fn(n) -> (rem(n, 3) == 0 || rem(n, 5) == 0) end
Enum.reduce_while(range, 0, fn i, acc ->
if multiple_of_3_or_5?.(i), do: {:cont, acc + i}, else: {:cont, acc}
end)
时才会刷新此映射。至少在使用相同机制的R 3.4.0和早期版本中就是这种情况。
与我的第一印象相反,这不是一个错误,而是一个特征: - )