Проблема с функцией «max» и датами с R

#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"