far*_*ble 5 r date coercion posixlt
我最近遇到了R代码,它将POSIXlt日期对象与日期字符串进行了比较.
as.POSIXlt.date("2007-02-02") >= "2007-02-01"
[1] FALSE
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是,结果至少对我来说是假的.我期待POSIXlt对象被强制转换为字符向量,因此不等式应该测试为TRUE.然后我尝试了明确的强制,并强迫任何一方进入另一方的类型,产生了真实.
as.character(as.POSIXlt.date("2007-02-02")) >= "2007-02-01"
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
和
as.POSIXlt.date("2007-02-02") >= as.POSIXlt.date("2007-02-01")
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
我认为将LHS日期对象强制转换为字符向量在语义上是错误的,因为那时的比较将是词典,而不是预期的(尽管在这种情况下它的计算结果为TRUE).我对吗?
在我看来,第三个表达是语义上正确的代码.但为什么第一个代码不起作用(评估为FALSE)?在比较它们之前,R是否强制转换为字符向量?
这是我的平台信息:
R version 3.1.0 (2014-04-10) -- "Spring Dance"
Platform: x86_64-redhat-linux-gnu (64-bit)
Run Code Online (Sandbox Code Playgroud)
我是R的新手.非常感谢任何帮助.
谢谢,法尔汉
一般来说,进行比较时,日期都应该是class Date 。
它在某些情况下有效,因为 R在幕后将字符串“2007-02-01”转换为日期,这在某些情况下可能会失败:
as.Date("2020-09-12") <= "2020:09:13"
# Error in charToDate(x) :
# character string is not in a standard unambiguous format
Run Code Online (Sandbox Code Playgroud)
另外,请注意不同的 Date 方法,它们是不兼容的:
as.POSIXlt("2007-02-02") <= as.Date("2020,01,12", "%Y,%m,%d")
# sec min hour mday mon year wday yday isdst zone gmtoff
# TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE NA NA
#Warning messages:
#1: Incompatible methods ("Ops.POSIXt", "Ops.Date") for "<="
#2: NAs introduced by coercion
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我无法再重现第一个示例(R 版本 4.0.3):
as.POSIXlt.date("2007-02-02") >= "2007-02-01"
# Error in as.POSIXlt.date("2007-02-02") :
# could not find function "as.POSIXlt.date"
as.POSIXlt.Date("2007-02-02") >= "2007-02-01"
# [1] NA
# Warning message:
# In as.POSIXlt.Date("2007-02-02") : NAs introduced by coercion
Run Code Online (Sandbox Code Playgroud)