2015-11-05 42 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