Проблема в том, что year()
, кажется, возвращает numeric
, поэтому он больше не является date
объектом.
Это метод по умолчанию для year()
:
year.default <- function(x)
as.POSIXlt(x, tz = tz(x))$year + 1900
Так, например:
y <- as.POSIXlt("2018-01-03 09:10:58 CET", tz = Sys.timezone())$year + 1900
#y
#[1] 2018
Обратите внимание, что я форсировал ток tz
с помощью Sys.timezone()
.
Но:
class(y)
#[1] "numeric"
Таким образом, когда вы звоните tz(y)
, поскольку он числовой, он не имеет атрибута tz
, и по умолчанию ему присваивается "UTC"
.
# example:
# tz(123)
# [1] "UTC"
Простое решениеэто установить себе часовой пояс:
attr(y, "tzone") <- Sys.timezone()
y
#[1] 2018
#attr(,"tzone")
#[1] "Europe/Berlin"
Так что теперь tz
работает:
tz(y)
[1] "Europe/Berlin"
Я бы посоветовал против этого, но вы также можете изменить метод по умолчанию: tz () :
my_tz <- function(x) {
tzone <- attr(x, "tzone")[[1]]
if (is.null(tzone) && !is.POSIXt(x))
return(Sys.timezone()) # original was "UTC"
if (is.character(tzone) && nzchar(tzone))
return(tzone)
tzone <- attr(as.POSIXlt(x[1]), "tzone")[[1]]
if (is.null(tzone))
return(Sys.timezone()) # original was "UTC"
tzone
}
my_tz(y)
#[1] "Europe/Berlin"
Итак, теперь у вас есть «пользовательская» версия tz()
, которая возвращает текущий часовой пояс всякий раз, когда введенные данные имеют неправильный формат даты.