2015-11-05 1 views
4

У меня есть кадр данных, который имеет поле «DATE». например: "24-10-2015"Как получить дату с помощью sqldf?

Переменная находится в формате даты.

При использовании sqldf, например .: select min(DATE), MAX (DATE) from table ... выход представляет собой число, как 16623.

Пробовал FORMAT и CONVERT, но они не работают в 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

Я предлагаю вам превратить вашу дату POSIXct с помощью as.POSIXct, так что вы можете работать с date функцией SQLite:

Используя некоторые случайные данные:

#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)', который вернет дату. – 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 л origin для функции 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

Хороший! На моем компьютере 'as.Date (16623)' возвращает ошибку: ''origin' должно быть поставлено'. Вероятно, это ошибка LyzandeR

+1

@ LyzandeR: Я не знаю, почему он работает на моем компьютере, так как у меня есть R 3.0.2. Но в справке написано: «as.Date будет принимать числовые данные (количество дней с эпохи), но только если источник поставляется ». поэтому наилучшей практикой является включение источника – etienne