我的数据框有一个“DATE”字段。例如:"24-10-2015"
变量采用日期格式。
当我使用 sqldf 时,例如:select min(DATE), MAX (DATE) from table ...
输出的数字是16623
。
尝试 FORMAT 和 CONVERT ,但它们在sqldf中不起作用。
任何提示?
答案 0 :(得分:7)
指定数据框中每列的方法。假设'data'是数据框的名称,列名称'd'包含'Date'格式。
尝试以下方法:
sqldf('select max(d) as MAX__Date,
min(d) as MIN__DATE
from data',
method = "name__class")
这应该有效。
答案 1 :(得分:4)
我建议您使用POSIXct
将日期转换为as.POSIXct
,以便您可以使用date
的{{1}}函数:
使用一些随机数据:
SQLite
然后你可以这样做:
#notice I keep the class of the date as POSIXct
#it really does not change anything
df <- data.frame(date = as.POSIXct('2015-01-01'))
#> df
# date
#1 2015-01-01
你有你需要的东西。有关SQLite如何理解日期here
的更多信息答案 2 :(得分:2)
另一种可能性是不更改您的sqldf
功能,然后转换存储为数字的日期。您可以使用as.Date()
:
zoo::as.Date(16623)
[1] "2015-07-07"
正如LyzandeR所提到的,你应该指定origin
来说明第一个日期是什么。如果您使用的是zoo
软件包,则默认为“1970-01-01”,对于您的格式,它可能是正确的来源,但如果您不使用它(意味着您起诉{ {1}}包然后你必须指定它。
base
但如果您有来自Excel的日期,则应更改原点:
as.Date(16623, origin = "1970-01-01")
[1] "2015-07-07"
我实际上找到了为什么不提供zoo::as.Date(42313)
[1] "2085-11-06"
as.Date(42313, origin = "1899-12-30") # for Windows, use "1904-01-01" for Mac
[1] "2015-11-05" # correct result
为我工作:我加载了包origin
,其中“1970-01-01”是zoo
的默认选项:
origin
以下是您可以看到base::as.Date(16623)
Error in as.Date.numeric(16623) : 'origin' must be supplied
zoo::as.Date(16623)
[1] "2015-07-07"
为函数zoo
指定默认origin
的代码,而不是as.Date.numeric
包的情况:
base
答案 3 :(得分:0)
如果仅需要检查特定的日期值而不是日期范围,则可以在调用sql代码之前使用as.character将日期列转换为字符串,如下所示:
table$date2 = as.character(table$date)
sqldf("select max(date2), min(date2) from table")
这对我来说确实很好,并且我还没有遇到任何缺点。