首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用sqldf获取日期?

如何使用sqldf获取日期?
EN

Stack Overflow用户
提问于 2015-11-05 15:13:44
回答 4查看 12.3K关注 0票数 5

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

变量采用日期格式。

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

尝试了格式和转换,但它们不能在sqldf中工作。

有什么暗示吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-11-05 15:36:03

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

尝试以下几点:

代码语言:javascript
复制
sqldf('select max(d) as MAX__Date,
              min(d) as MIN__DATE
       from data',
      method = "name__class")

这应该能行。

票数 8
EN

Stack Overflow用户

发布于 2015-11-05 15:26:10

我建议您使用POSIXct将日期转换为as.POSIXct,以便使用SQLitedate函数。

使用一些随机数据:

代码语言:javascript
复制
#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

然后你就可以:

代码语言:javascript
复制
#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如何理解日期这里的更多信息。

票数 4
EN

Stack Overflow用户

发布于 2015-11-05 15:44:03

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

代码语言:javascript
复制
zoo::as.Date(16623)
[1] "2015-07-07"

正如LyzandeR所提到的,您应该指定一个origin,它说明第一个日期是什么。如果您使用的是zoo包,缺省值是"1970-01-01“,对于您的格式,它可能是正确的来源,但是如果您不使用它(这意味着您从base包中起诉函数,那么您必须指定它。

代码语言:javascript
复制
as.Date(16623, origin = "1970-01-01")
[1] "2015-07-07"

但是,如果您有来自Excel的日期,则应该更改来源:

代码语言:javascript
复制
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的默认选项。

代码语言:javascript
复制
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包的情况并非如此:

代码语言:javascript
复制
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>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33548219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档