R:sqldf 中的日期函数给出异常答案(错误的日期格式?)
R: Date function in sqldf giving unusual answer (wrong date format?)
我正在尝试使用 sqldf 添加日期,我知道这应该很简单,但我无法弄清楚我的日期格式有什么问题。使用:
sqldf("select date(model_date, '+1 day') from lapse_test")
给出类似“-4666-01-23”的答案
model_date 的日期格式类似于 2015-01-01
我之前使用
从字符串 ('12/1/2015') 制作它们
lapse_test$model_date <- as.Date(lapse_test$date1,format = "%m/%d/%Y") or
lapse_test$model_date <- as.POSIXCT(lapse_test$date1,format = "%m/%d/%Y")
我猜这是问题所在?有什么想法吗?
将字符变量传递给 date()
函数似乎可行:
df <- data.frame(a=as.Date("2010-10-01"))
df$b <- as.character(df$a)
sqldf("select date(a) from df")
# date(a)
# 1 -4672-08-24
sqldf("select date(b) from df")
# date(b)
# 1 2010-10-01
sqldf("select date(b, '+1 day') from df")
# date(b, '+1 day')
# 1 2010-10-02
请注意,您可以直接在 R 中对 Date 对象进行(某些)算术运算,而无需 SQL:
df$a <- df$a + 1
df
# a b
# 1 2010-10-02 2010-10-01
SQLite 日期函数将日期视为自公元前 4714 年 11 月 24 日以来的天数,这意味着 16770
的整数存储对于示例日期 2015-12-01
在 R returns 某个地方的古老日期公元前 4667 年。
你可以算出 1970-01-01
的 R 源和 SQLite 源之间的差异是 2440588
天。这意味着,如果需要,您可以考虑这个常量:
test <- data.frame(model_date=as.Date("12/1/2015",format="%m/%d/%Y"))
sqldf("select date(model_date + 2440588, '+1 day') as select_date from test")
# select_date
#1 2015-12-02
@HongOoi 的回答可能更好,但我认为了解底层工作原理可能很有趣。
我正在尝试使用 sqldf 添加日期,我知道这应该很简单,但我无法弄清楚我的日期格式有什么问题。使用:
sqldf("select date(model_date, '+1 day') from lapse_test")
给出类似“-4666-01-23”的答案
model_date 的日期格式类似于 2015-01-01
我之前使用
从字符串 ('12/1/2015') 制作它们lapse_test$model_date <- as.Date(lapse_test$date1,format = "%m/%d/%Y") or
lapse_test$model_date <- as.POSIXCT(lapse_test$date1,format = "%m/%d/%Y")
我猜这是问题所在?有什么想法吗?
将字符变量传递给 date()
函数似乎可行:
df <- data.frame(a=as.Date("2010-10-01"))
df$b <- as.character(df$a)
sqldf("select date(a) from df")
# date(a)
# 1 -4672-08-24
sqldf("select date(b) from df")
# date(b)
# 1 2010-10-01
sqldf("select date(b, '+1 day') from df")
# date(b, '+1 day')
# 1 2010-10-02
请注意,您可以直接在 R 中对 Date 对象进行(某些)算术运算,而无需 SQL:
df$a <- df$a + 1
df
# a b
# 1 2010-10-02 2010-10-01
SQLite 日期函数将日期视为自公元前 4714 年 11 月 24 日以来的天数,这意味着 16770
的整数存储对于示例日期 2015-12-01
在 R returns 某个地方的古老日期公元前 4667 年。
你可以算出 1970-01-01
的 R 源和 SQLite 源之间的差异是 2440588
天。这意味着,如果需要,您可以考虑这个常量:
test <- data.frame(model_date=as.Date("12/1/2015",format="%m/%d/%Y"))
sqldf("select date(model_date + 2440588, '+1 day') as select_date from test")
# select_date
#1 2015-12-02
@HongOoi 的回答可能更好,但我认为了解底层工作原理可能很有趣。