R 如何使用sqldf获取日期?

R 如何使用sqldf获取日期?,r,date,sqldf,R,Date,Sqldf,我有一个数据框,有一个“日期”字段。e、 g.:“24-10-2015” 变量采用日期格式 当我使用sqldf时,例如:从表中选择min(日期)、MAX(日期)…输出是一个类似于16623的数字 尝试了格式化和转换,但在sqldf中不起作用 有什么提示吗?我建议您使用as.POSIXct将日期转换为POSIXct,以便使用SQLite的date功能: 使用一些随机数据: #notice I keep the class of the date as POSIXct #it really does

我有一个数据框,有一个“日期”字段。e、 g.:
“24-10-2015”

变量采用日期格式

当我使用sqldf时,例如:
从表中选择min(日期)、MAX(日期)…
输出是一个类似于
16623
的数字

尝试了格式化和转换,但在sqldf中不起作用


有什么提示吗?

我建议您使用
as.POSIXct
将日期转换为
POSIXct
,以便使用
SQLite
date
功能:

使用一些随机数据:

#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如何理解日期的更多信息

为数据框中的每一列指定方法。假设'data'是数据框的名称,列名称'd'包含'Date'格式

请尝试以下操作:

sqldf('select max(d) as MAX__Date,
              min(d) as MIN__DATE
       from data',
      method = "name__class")

这应该行得通

另一种可能性是不更改
sqldf
函数,然后转换存储为数字的日期。您可以将
用作.Date()
用于:

zoo::as.Date(16623)
[1] "2015-07-07"
正如LyzandeR提到的,您应该指定一个
原点
,它说明第一个日期是什么。如果您使用的是
zoo
软件包,默认值为“1970-01-01”,对于您的格式,它可能是正确的来源,但是如果您不使用它(意味着您从
base
软件包使用函数),则必须指定它

as.Date(16623, origin = "1970-01-01")
[1] "2015-07-07"
但如果您有Excel中的日期,则应更改来源:

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
对我有效:我加载了包
zoo
,其中“1970-01-01”是
origin
的默认选项:

base::as.Date(16623)
Error in as.Date.numeric(16623) : 'origin' must be supplied

zoo::as.Date(16623)
[1] "2015-07-07"
下面是代码,您可以看到
zoo
为函数
as.Date.numeric
指定了一个默认的
原点,而
base
包则不是这样:

base::as.Date.numeric
function (x, origin, ...) 
{
    if (missing(origin)) 
        stop("'origin' must be supplied")
    as.Date(origin, ...) + x
}
<bytecode: 0x17190e78>
<environment: namespace:base>

zoo::as.Date.numeric
function (x, origin, ...) 
{
    if (missing(origin)) 
        origin <- "1970-01-01"
    if (identical(origin, "0000-00-00")) 
        origin <- as.Date("0000-01-01", ...) - 1
    as.Date(origin, ...) + x
}
<environment: namespace:zoo>
base::as.Date.numeric
函数(x,原点,…)
{
如果(缺少(来源))
停止(“必须提供“原点”)
截止日期(原产地)+x
}
zoo::as.Date.numeric
函数(x,原点,…)
{
如果(缺少(来源))

origin如果只需要检查特定的日期值而不需要检查日期范围,则可以在调用sql代码之前使用as.character将日期列转换为字符串,如下所示:

table$date2 = as.character(table$date)
sqldf("select max(date2), min(date2) from table")
这对我来说非常有效,我还没有遇到任何缺点

发件人:

SO为当前和未来的读者创建长期可用的信息。问题应该是自包含的,并且需要最少的代码和数据,以便读者可以从问题中复制并粘贴到正在运行的R会话中,并查看海报所看到的内容。数据应该是问题的一部分,而不是其他地方,以确保其继续可用。使用R命令
dput(X)
以可复制的形式提供X。参见(1)(2)(3)另一种解决方案是使用
as.Date(16623)
,它将返回“2015-07-07”谢谢@etienne。你的意思是什么?当saxo运行他的代码时,输出是数字,因此在他的代码之后,他可以使用
as.Date(number)将数字转换为日期
它将返回一个日期。@etienne我明白了。那么,你的意思是在运行
sqldf
函数之后。这是肯定的。你仍然需要提供
origin
参数才能工作,但你是对的。你可能想把它作为答案来写。谢谢:)很好!在我的计算机上
as.Date(16623)
返回一个错误:
必须提供“origin”
。这可能是table$date2 = as.character(table$date) sqldf("select max(date2), min(date2) from table")