2015-11-05 79 views
4

我有一个数据框有一个“日期”字段。例如:"24-10-2015"如何使用sqldf获取日期?

变量是日期格式。

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

试图FORMATCONVERT但他们不sqldf工作。

任何提示?

+1

SO创建用于当前和未来的读者长期可用的信息。 问题应该包含所需的最小代码和数据,以便读者可以将其从问题中复制并粘贴到正在运行的R会话中,并查看发布者看到的内容。数据应该是问题的一部分,而不是其他地方,以确保它继续是可行的。使用R命令'dput(X)'以可重现的形式提供X.参见(1)http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example(2)http://stackoverflow.com/help/mcve(3)http: //stackoverflow.com/help/how-to-ask –

回答

7

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

尝试以下操作:

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

这应该工作。

+1

这是我最喜欢的方法,因为没有对数据帧的数据进行更改。它工作! – saxo

3

我建议你使用as.POSIXct,使您可以用SQLitedate功能工作改变你的日期POSIXct

使用一些随机数据:

#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

+0

另一个解决方案是使用'as.Date(16623)'这将返回“2015-07-07” – etienne

+0

谢谢@etienne。你是什​​么意思? – LyzandeR

+0

当saxo运行他的代码时,输​​出是数字,所以在他的代码之后,他可以使用'as.Date(number)'将数字转换为日期,这将返回Date。 – etienne

2

另一种可能性是不要更改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" 

这里是代码,你可以看到zoo指定defau用于功能as.Date.numeric这不是用于base包的情况下LT origin

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

好的!在我的计算机上'as.Date(16623)'返回一个错误:必须提供'origin'。这可能是一个 LyzandeR

+1

@LyzandeR:我不知道它为什么在我的电脑上工作,因为我有R 3.0.2但在帮助中它写成“as.Date将接受数字数据(自一个时代以来的天数),但只有在原产地被提供。“所以最好的做法是包括原点 – etienne