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