web-dev-qa-db-fra.com

Arrondir une date POSIX (POSIXct) avec la fonctionnalité de base R

Je joue actuellement beaucoup avec les dates et les heures d'un paquet que je suis en train de construire.

Trébucher sur ce post m'a rappelé que ce n’est généralement pas une mauvaise idée de vérifier si quelque chose peut être fait avec les fonctionnalités de base de R avant de passer aux paquetages contrib.

Ainsi, est-il possible d'arrondir une date de classe POSIXct avec une fonctionnalité de base R?

J'ai vérifié

methods(round)

qui "seulement" m'a donné

[1] round.Date      round.timeDate*

   Non-visible functions are asterisked

C'est ce que j'aimerais faire (pseudo code)

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"

Je sais que cela peut être fait avec timeDate , lubridate etc., mais je voudrais limiter les dépendances des paquets. Donc, avant d'aller de l'avant et de vérifier le code source des paquets respectifs, je pensais que je demanderais si quelqu'un a déjà fait quelque chose comme ça.

26
Rappster

base a round.POSIXt pour le faire. Vous ne savez pas pourquoi cela ne vient pas avec 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"
38
James

Sur ce thème avec lubridate, examinez également les fonctions ceiling_date() et 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"
12
nzcoops

Si vous ne voulez pas appeler des bibliothèques externes et que vous voulez garder POSIXct comme je le fais, voici une idée (inspirée par cette question ): utilisez strptime et collez un mois et un jour fictifs. Il devrait être possible de le faire plus simplement, comme indiqué dans ce commentaire

"Pour strptime, la chaîne d'entrée n'a pas besoin de spécifier complètement la date: il est supposé que les secondes, minutes ou heures non spécifiées sont égales à zéro, et qu'une année, un mois ou un jour non spécifié est celui en cours."

Ainsi, il semble que vous devez utiliser strftime pour générer une chaîne tronquée, coller la partie manquante et reconvertir à nouveau dans POSIXct.

Voici à quoi pourrait ressembler une réponse de mise à jour:

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"
1
Simon C.