#r #max #lubridate
#r #макс #lubridate
Вопрос:
У меня есть фрейм данных с датами, и я просто хочу знать максимальную дату:
dates <- data.frame( randomdate = c("30-11-2018", "25-10-2018", "10-12-2015", "10-01-2020", "15-2-2013", "17-8-1999") )
Поэтому я конвертирую их в формат даты:
dates$randomdate <- as.POSIXct(dates$randomdate,format = "%d-%m-%Y")
И затем я прошу создать столбец с последней датой:
dates$last_date= as.Date(max(dates$randomdate))
Проблема в том, что последняя дата в моем наборе данных — 10 января 2020 года, а функция max просто придумывает дату и выдает мне «9 января 2020 года» (этой даты даже нет в моем наборе данных)
Если кто-нибудь может мне помочь, возможно, я не понимаю, как работает функция max…
С уважением
Комментарии:
1. Проблема заключается в неправильном использовании
as.POSIXct
для преобразования в формат даты (предупреждения должны быть подсказкой). Используйтеas.Date
вместо этого.2. Спасибо, теперь это работает. У меня не было никаких предупреждений, в чем разница между «as.Date» и «as. POSIXct»? Почему он каждый раз выдает мне «накануне»?
3. Извините, вы получите предупреждения, если опустите «format = «, как я сделал 🙂
as.POSIXct
предназначен для манипулирования объектами даты и времени, поэтому он использует часовые пояса. В зависимости от вашего часового пояса по умолчанию вы можете получить дату, отличную от даты UTC.as.Date
предназначен для работы с объектами даты. Поэтому, если у вас есть только даты (без времени), лучше всего использоватьas.Date
.
Ответ №1:
Как уже упоминалось в комментариях и в другом ответе, который вы должны использовать as.Date
для преобразования в даты, поскольку у вас есть даты. Однако причина, по которой вы получаете максимальную дату как «9 января 2020 года», заключается в том, что as.POSIXct
преобразует объект в ваш местный часовой пояс, тогда as.Date
как использует часовой пояс «UTC».
Для ее решения вы можете использовать один и тот же часовой пояс в обеих функциях.
dates$randomdate <- as.POSIXct(dates$randomdate,format = '%d-%m-%Y', tz = 'UTC')
dates$last_date <- max(as.Date(dates$randomdate))
Ответ №2:
Отсортируйте свои данные и извлеките последнюю строку.
dates$randomdate <- as.Date(dates$randomdate,format = "%d-%m-%Y")
dates <- data.frame(randomdate=dates[order(as.Date(dates$randomdate, format="%Y/%m/%d")),])
dates[nrow(dates),]
> dates[nrow(dates),]
[1] "2020-01-10"