如何使用sqldf获取日期?

问题描述 投票:4回答:4

我有一个具有“DATE”字段的数据框。例如:"24-10-2015"

变量采用日期格式。

当我使用sqldf时,例如:select min(DATE), MAX (DATE) from table ...,输出是一个像16623的数字。

试过FORMAT和CONVERT,但它们在sqldf中不起作用。

任何提示?

r date sqldf
4个回答
7
投票

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

请尝试以下方法:

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

这应该工作。


4
投票

我建议你使用POSIXct将你的日期转换为as.POSIXct,这样你就可以使用dateSQLite函数了:

使用一些随机数据:

#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的更多信息


3
投票

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

zoo::as.Date(16623)
[1] "2015-07-07"

正如LyzandeR所提到的,你应该指定一个origin来说明第一个日期是什么。如果您使用的是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"

下面是代码,您可以看到zooorigin函数指定了默认的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>

0
投票

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

table$date2 = as.character(table$date)
sqldf("select max(date2), min(date2) from table")

这对我来说非常好,我还没有遇到任何缺点。

来自:https://ladvien.com/sqldf-dates/

© www.soinside.com 2019 - 2024. All rights reserved.