R: смазка возвращается NA – неожиданно

Я обнаружил довольно неожиданное поведение смазки. Следующий код R возвращает NA вместо '2010-10-17 08:00:00':

library(lubridate);
as.POSIXct("2010-10-17 07:59:01") + seconds(59);
as.POSIXct("2010-10-17 07:59:30") + seconds(30);

Принимая во внимание, что следующий фрагмент возвращает ожидаемое значение («2010-10-17 07:59:00»):

as.POSIXct("2010-10-17 07:58:01") + seconds(59);
as.POSIXct("2010-10-17 07:58:30") + seconds(30);

Это ошибка в lubridate или мне просто нужно более тщательно RTFM?! :)

ОБНОВЛЕНИЕ: Используемое программное обеспечение: Gnu R v 3.0.2, смазка 1.3.3

ОБНОВЛЕНИЕ 2. Использование дсекунд вместо секунд решает эту проблему.

Правильный результат рассчитывается по:

as.POSIXct("2010-10-17 07:58:01") + dseconds(59);
as.POSIXct("2010-10-17 07:58:30") + dseconds(30);

person TOBx2    schedule 04.03.2014    source источник
comment
Похоже, это может быть проблема с часовым поясом и/или переходом на летнее время.   -  person Joshua Ulrich    schedule 04.03.2014
comment
с каким классом вы создали "2010-10-17 07:59:01" (для проверки)?   -  person Rich Scriven    schedule 04.03.2014
comment
@Джошуа: Спасибо. Но вы можете изменить месяц на любое допустимое значение, и поведение останется прежним...   -  person TOBx2    schedule 04.03.2014
comment
@RScriv: я не понимаю вашего вопроса. Это просто струна...   -  person TOBx2    schedule 04.03.2014
comment
@CarlWitthoft: я пробовал следующее: ymd_hms(2010-01-17 07:59:01) + секунды(59); что также возвращает NA. :/   -  person TOBx2    schedule 04.03.2014
comment
метод base использует strptime. lubridate нет. Попробуйте unclass в строке, а затем посмотрите, что произойдет.   -  person Rich Scriven    schedule 04.03.2014
comment
@JoshuaUlrich взгляните на последнее редактирование моего ответа. Что именно с 8 вечера?   -  person Carl Witthoft    schedule 04.03.2014
comment
@CarlWitthoft: сейчас 8 утра, а я понятия не имею. Похоже проблема со смазкой.   -  person Joshua Ulrich    schedule 04.03.2014


Ответы (1)


Окончательное редактирование: известная ошибка: https://github.com/hadley/lubridate/issues/188

Я нашел ошибку, так сказать: очевидно, объект класса POSIXct позволит вам изменить свою часть seconds, но нет функции «переноса», поэтому, если вы заставите общее количество секунд превышать 59, он сдается.

Rgames> as.POSIXct("2010-10-17 07:59:30")->dfoo
Rgames> dfoo
[1] "2010-10-17 07:59:30 EDT"

Rgames> second(dfoo)
[1] 30
Rgames> second(dfoo)<-second(dfoo)+10
Rgames> dfoo
[1] "2010-10-17 07:59:40 EDT"
Rgames> second(dfoo)<-second(dfoo)+seconds(10)
Rgames> dfoo
[1] "2010-10-17 07:59:50 EDT"
Rgames> second(dfoo)<-second(dfoo)+seconds(10)
Rgames> dfoo
[1] NA

Каково предполагаемое использование функций lubridate::seconds и second, я не знаю, но очевидно, что это не тот путь :-( .

РЕДАКТИРОВАТЬ: я продолжал играть с dfoo, как указано выше, и dbar <- as.POSIXct("2010-10-17 07:59:30",tz='GMT'). Я мог бы добавить произвольные секунды к dbar без проблем. Кроме того, я использовал with_tz для переключения часовых поясов как для dfoo, так и для dbar, и независимо от назначенного пояса мог успешно добавлять произвольные секунды. Это заставляет меня задаться вопросом, что [отредактировано] as.POSIXct делает с аргументом tz='' по умолчанию!

РЕДАКТИРОВАТЬ 2: эй, смотри:

Rgames> as.POSIXct("2010-10-17 07:59:30")->dfoo
Rgames> dfoo + seconds(55)
[1] "2010-10-17 08:00:25 EDT"
Rgames> dfoo + seconds(30)
[1] NA
Rgames> dfoo + seconds(31)
[1] "2010-10-17 08:00:01 EDT"
Rgames> dfoo + seconds(29)
[1] "2010-10-17 07:59:59 EDT"
person Carl Witthoft    schedule 04.03.2014
comment
Не уверен, что причина в этом, но в описании пакета сказано, что он позволяет использовать доли секунды, если вы того пожелаете. - person Rich Scriven; 04.03.2014
comment
Читая статью по адресу r-statistics.com/2012/03/ кажется, что lubridate::seconds – это период, и в статье подразумевается, что это намеренно указано точно, но lubridate::dseconds рассматривается как продолжительность, что по замыслу является точным, поэтому при попытке добавить неточное время к объекту с опрокидыванием, может быть, из-за неточности? Документы не ясны, но об этом нужно помнить. - person Maurice Reeves; 04.03.2014