Дата и время преобразования в R - PullRequest
3 голосов
/ 12 января 2012

Я знаю, что подобные вещи обсуждались, но вот несколько вещей, на которые я пока не нашел ответов.

1: Дата до POSIXct

> Sys.timezone()
[1] "EST"

> as.POSIXct("2011-01-30")
[1] "2011-01-30 EST"

> as.POSIXct(as.Date("2011-01-30"))
[1] "2011-01-29 19:00:00 EST"

> as.POSIXct(as.Date("2011-01-30"), tz="EST")
[1] "2011-01-29 19:00:00 EST"

> as.POSIXct(as.Date("2011-01-30"), tz="GMT")
[1] "2011-01-29 19:00:00 EST"

> as.POSIXct(as.Date("2011-01-30"), tz="America/New_York")
[1] "2011-01-29 19:00:00 EST"

> as.POSIXct(as.Date("2011-01-30"), tz="")
[1] "2011-01-29 19:00:00 EST"

Может кто-нибудь сказать мне, почему, есливвод даты, я не могу получить полночь 30 января, хотя я указал правильный часовой пояс?Хотя, если ввод - символьная строка, тогда я в порядке.

2: преобразование даты / символов.

Оба ужасно медленные.Затем я обнаружил, что преобразовать строку символов в Date на самом деле намного быстрее, сначала преобразовав ее в POSIXlt:

> d3.str = "2011-03-02 23:59:00";
> N=10000
> system.time(for(i in 1:N) r5.dt = as.Date(d3.str))
   user  system elapsed 
   1.25    0.00    1.24 
> system.time(for(i in 1:N) r6.dt = as.Date(strptime(d3.str, format="%Y-%m-%d")))
   user  system elapsed 
   0.37    0.00    0.38 
> r5.dt
[1] "2011-03-02"
> r5.dt==r6.dt
[1] TRUE

Я сейчас растерялся.Есть ли более быстрый и элегантный способ конвертировать персонажа в дату?И дата для персонажа вместо as.character, что тоже довольно медленно?

Заранее спасибо!

Ответы [ 3 ]

7 голосов
/ 12 января 2012

Очень рано на странице справки as.POSIXct мы читаем: «Даты без времени рассматриваются как полуночные UTC». Ваше ожидание, что аргумент 'tz' изменит это, просто ошибочно. Вы можете получить исходную дату, указав выход в UCT:

 strftime(as.POSIXct(as.Date("2011-01-30")), format="%Y-%m-%d %H:%M:%S", tz="UCT")
#[1] "2011-01-30 00:00:00"

Если вы действительно хотите просто свидание, тогда вы должны использовать as.Date.

4 голосов
/ 12 января 2012

Что касается вашего второго вопроса, многое, вероятно, будет понятнее, если вы сравните код для as.Date.character и as.Date.POSIXlt. Один из них должен сделать гораздо больше проверок, так как вы не указали формат.

Что касается общей скорости, вы не векторизуете свои конверсии. as.Date и strptime и большинство других функций преобразования даты / времени принимают векторов дат и значений времени / даты. Это будет значительно быстрее, чем путь.

2 голосов
/ 12 января 2012

Аргумент tz в as.POSIXct используется только со строками, и (молча) игнорируется в противном случае.Возможно, вы захотите взглянуть на пакеты, разработанные для помощи в манипулировании датами, например, функция with_tz в пакете lubridate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...