Нечетный вывод из R POSIXlt - PullRequest
       3

Нечетный вывод из R POSIXlt

2 голосов
/ 12 сентября 2011

Может кто-нибудь объяснить, что второй год $ не равен 1?

> d = as.POSIXlt("1900-01-01")
> d$year
[1] 0
> d$mon = d$mon + 12
> d
[1] "1901-01-01"
> d$year
[1] 0
>

Контраст с этим:

> d = as.POSIXlt("1900-01-01")
> d
[1] "1900-01-01"
> d$year
[1] 0
> d$year = d$year + 1
> d
[1] "1901-01-01"
> d$year
[1] 1
>

Ответы [ 2 ]

3 голосов
/ 12 сентября 2011

Это потому, что вы напрямую манипулируете элементами списка (POSIXlt объект). При печати он нормализуется к «реальной» дате, но при доступе к отдельным элементам они все еще имеют ненормализованные значения.

Рассмотрим d <- as.POSIXlt ("1900-01-01") </p>

dput(d)
d$mon <- d$mon + 12
dput(d)
d <- as.POSIXlt(as.POSIXct(d))
dput(d)

, что дает

> d <- as.POSIXlt("1900-01-01")
> dput(d)
structure(list(sec = 0, min = 0L, hour = 0L, mday = 1L, mon = 0L, 
    year = 0L, wday = 1L, yday = 0L, isdst = 0L), .Names = c("sec", 
"min", "hour", "mday", "mon", "year", "wday", "yday", "isdst"
), class = c("POSIXlt", "POSIXt"))
> d$mon <- d$mon + 12
> dput(d)
structure(list(sec = 0, min = 0L, hour = 0L, mday = 1L, mon = 12, 
    year = 0L, wday = 1L, yday = 0L, isdst = 0L), .Names = c("sec", 
"min", "hour", "mday", "mon", "year", "wday", "yday", "isdst"
), class = c("POSIXlt", "POSIXt"))
> d <- as.POSIXlt(as.POSIXct(d))
> dput(d)
structure(list(sec = 0, min = 0L, hour = 0L, mday = 1L, mon = 0L, 
    year = 1L, wday = 2L, yday = 0L, isdst = 0L), .Names = c("sec", 
"min", "hour", "mday", "mon", "year", "wday", "yday", "isdst"
), class = c("POSIXlt", "POSIXt"), tzone = c("", "PST", "PDT"
))

Обратите внимание, что приведение к POSIXct и обратно к POSIXlt нормализовало его (год равен 1, а месяц равен 0)

2 голосов
/ 12 сентября 2011

POSIXlt объекты являются списками.Вы изменили элемент mon списка.Это не меняет элемент списка year.

d <- as.POSIXlt("1900-01-01")
unclass(d)
d$mon <- 12
unclass(d)

Если вы хотите, чтобы ваше изменение изменило любой / все другие элементы списка, преобразуйте его в POSIXct, а затем обратно в POSIXlt.

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