Действительно, как уже упоминалось выше (и в других местах SO), чтобы преобразовать строку в дату, вам нужна конкретная дата месяца.На странице руководства as.Date()
:
Если в строке даты не указана дата полностью, возвращаемый ответ может зависеть от системы.Наиболее распространенным поведением является предположение, что текущий, отсутствующий год, месяц или день.Если он указывает неверную дату, надежные реализации выдадут ошибку, а дата будет отображена как NA.К сожалению, некоторые распространенные реализации (такие как glibc
) ненадежны и предполагают предполагаемое значение.
Простым решением было бы вставить дату "01"
к каждой дате и использовать strptime()
дляукажите это как первый день этого месяца.
Для тех, кто ищет немного больше информации о датах и времени обработки в R:
В R времена используют классы POSIXct
и POSIXlt
, а даты используют класс Date
.
Даты сохраняются как количество дней с 1 января 1970 года, а время - как число.секунд с 1 января 1970 года.
Так, например:
d <- as.Date("1971-01-01")
unclass(d) # one year after 1970-01-01
# [1] 365
pct <- Sys.time() # in POSIXct
unclass(pct) # number of seconds since 1970-01-01
# [1] 1450276559
plt <- as.POSIXlt(pct)
up <- unclass(plt) # up is now a list containing the components of time
names(up)
# [1] "sec" "min" "hour" "mday" "mon" "year" "wday" "yday" "isdst" "zone"
# [11] "gmtoff"
up$hour
# [1] 9
Для выполнения операций с датами и временем:
plt - as.POSIXlt(d)
# Time difference of 16420.61 days
И для обработки дат,Вы можете использовать strptime()
(заимствуя эти примеры из страницы руководства):
strptime("20/2/06 11:16:16.683", "%d/%m/%y %H:%M:%OS")
# [1] "2006-02-20 11:16:16 EST"
# And in vectorized form:
dates <- c("1jan1960", "2jan1960", "31mar1960", "30jul1960")
strptime(dates, "%d%b%Y")
# [1] "1960-01-01 EST" "1960-01-02 EST" "1960-03-31 EST" "1960-07-30 EDT"