Подтвердить что ты не робот

Закруглить дату POSIX (POSIXct) с базовыми функциональными возможностями R

В настоящее время я много играю с датами и временем для пакета, который я создаю.

Наткнувшись на этот пост, я снова напомнил, что обычно неплохо проверить, можно ли что-то сделать с помощью базовых функций R, прежде чем переходить к пакетам contrib.

Таким образом, возможно ли округлить дату класса POSIXct с базовой функциональностью R?

Я проверил

methods(round)

который "только" дал мне

[1] round.Date      round.timeDate*

   Non-visible functions are asterisked

Это то, что я хотел бы сделать (псевдокод)

x <- as.POSIXct(Sys.time())
[1] "2012-07-04 10:33:55 CEST"

round(x, atom="minute")
[1] "2012-07-04 10:34:00 CEST"

round(x, atom="hour")
[1] "2012-07-04 11:00:00 CEST"

round(x, atom="day")
[1] "2012-07-04 CEST"

Я знаю, что это можно сделать с помощью timeDate, lubridate и т.д., Но я бы хотел уменьшить зависимости пакетов. Поэтому, прежде чем идти дальше и проверять исходный код соответствующих пакетов, я подумал, что я хотел бы спросить, если кто-то уже сделал что-то подобное.

4b9b3361

Ответ 1

base имеет round.POSIXt для этого. Не уверен, почему он не придумал methods.

x <- as.POSIXct(Sys.time())
x
[1] "2012-07-04 10:01:08 BST"
round(x,"mins")
[1] "2012-07-04 10:01:00 BST"
round(x,"hours")
[1] "2012-07-04 10:00:00 BST"
round(x,"days")
[1] "2012-07-04"

Ответ 2

В этой теме с помощью lubridate также просмотрите функции ceiling_date() и floor_date():

x <- as.POSIXct("2009-08-03 12:01:59.23")
ceiling_date(x, "second")
# "2009-08-03 12:02:00 CDT"
ceiling_date(x, "hour")
# "2009-08-03 13:00:00 CDT"
ceiling_date(x, "day")
# "2009-08-04 CDT"
ceiling_date(x, "week")
# "2009-08-09 CDT"
ceiling_date(x, "month")
# "2009-09-01 CDT"

Ответ 3

Если вы не хотите вызывать внешние библиотеки и хотите сохранить POSIXct как я это делаю, это одна идея (вдохновленная этим вопросом): используйте strptime и вставьте фальшивый месяц и день. Должно быть возможно сделать это более прямым, как сказано в этом комментарии

"Для strptime во входной строке не обязательно указывать дату полностью: предполагается, что неопределенные секунды, минуты или часы равны нулю, а текущим является неопределенный год, месяц или день".

Таким образом, кажется, что вы должны использовать strftime для вывода усеченной строки, вставить недостающую часть и снова преобразовать в POSIXct.

Вот как может выглядеть ответ на обновление:

x <- as.POSIXct(Sys.time())
x
[1] "2018-12-27 10:58:51 CET"
round(x,"mins")
[1] "2018-12-27 10:59:00 CET"
round(x,"hours")
[1] "2018-12-27 11:00:00 CET"
round(x,"days")
[1] "2018-12-27 CET"
as.POSIXct(paste0(strftime(x,format="%Y-%m"),"-01"))     #trunc by month
[1] "2018-12-01 CET"
as.POSIXct(paste0(strftime(x,format="%Y"),"-01-01"))     #trunc by year
[1] "2018-01-01 CET"