如何使用sqldf获取日期?
How to get date using sqldf?
我有一个包含 "DATE" 字段的数据框。例如:"24-10-2015"
变量是日期格式。
当我使用 sqldf 时,例如:select min(DATE), MAX (DATE) from table ...
输出是一个像 16623
.
这样的数字
尝试了 FORMAT 和 CONVERT 但它们在 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
然后你可以做:
#using the date function in SQLite you convert the nanoseconds
#produced by min(date) back to a date.
sqldf('select date(min(date), "unixepoch", "localtime") from df')
date(min(date), "unixepoch", "localtime")
1 2015-01-01
而且您拥有所需的一切。有关 SQLite 如何理解日期的更多信息 here
为数据框中的每一列指定方法。假设 'data' 是数据框的名称,其列名 'd' 包含 'Date' 格式。
尝试以下操作:
sqldf('select max(d) as MAX__Date,
min(d) as MIN__DATE
from data',
method = "name__class")
这应该有效。
另一种可能性是不更改 sqldf
函数,然后将存储的日期转换为数字。您可以为此使用 as.Date()
:
zoo::as.Date(16623)
[1] "2015-07-07"
正如 LyzandeR 提到的,您应该指定一个 origin
来说明第一个日期是什么。如果您使用 zoo
包,默认值为“1970-01-01”,对于您的格式,它可能是正确的来源,但如果您不使用它(意味着您从 base
package 那么你必须指定它。
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”是 [=17= 的默认选项]:
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
指定了默认值 origin
,而 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>
如果您只需要检查特定的日期值而不是日期范围,您可以在调用 sql 代码之前使用 as.character 将日期列转换为字符串,如下所示:
table$date2 = as.character(table$date)
sqldf("select max(date2), min(date2) from table")
这对我来说非常有效,我还没有 运行 遇到任何缺点。
我有一个包含 "DATE" 字段的数据框。例如:"24-10-2015"
变量是日期格式。
当我使用 sqldf 时,例如:select min(DATE), MAX (DATE) from table ...
输出是一个像 16623
.
尝试了 FORMAT 和 CONVERT 但它们在 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
然后你可以做:
#using the date function in SQLite you convert the nanoseconds
#produced by min(date) back to a date.
sqldf('select date(min(date), "unixepoch", "localtime") from df')
date(min(date), "unixepoch", "localtime")
1 2015-01-01
而且您拥有所需的一切。有关 SQLite 如何理解日期的更多信息 here
为数据框中的每一列指定方法。假设 'data' 是数据框的名称,其列名 'd' 包含 'Date' 格式。
尝试以下操作:
sqldf('select max(d) as MAX__Date,
min(d) as MIN__DATE
from data',
method = "name__class")
这应该有效。
另一种可能性是不更改 sqldf
函数,然后将存储的日期转换为数字。您可以为此使用 as.Date()
:
zoo::as.Date(16623)
[1] "2015-07-07"
正如 LyzandeR 提到的,您应该指定一个 origin
来说明第一个日期是什么。如果您使用 zoo
包,默认值为“1970-01-01”,对于您的格式,它可能是正确的来源,但如果您不使用它(意味着您从 base
package 那么你必须指定它。
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”是 [=17= 的默认选项]:
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
指定了默认值 origin
,而 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>
如果您只需要检查特定的日期值而不是日期范围,您可以在调用 sql 代码之前使用 as.character 将日期列转换为字符串,如下所示:
table$date2 = as.character(table$date)
sqldf("select max(date2), min(date2) from table")
这对我来说非常有效,我还没有 运行 遇到任何缺点。