How can I add one day in a datetime in R?
structure(list(timestamp = structure(1667523601, tzone = "UTC", class = c("POSIXct",
"POSIXt"))), class = "data.frame", row.names = c(NA, -1L))
CodePudding user response:
1) Add seconds If xx is the input then add one day's worth of seconds. This works because POSIXct is internally expressed in seconds and R does not use leap seconds (although it does have a builtin vector, .leap.seconds, available). No packages are used.
xx$timestamp
## [1] "2022-11-04 01:00:01 UTC"
xx$timestamp 24 * 60 * 60
## [1] "2022-11-05 01:00:01 UTC"
2) POSIXlt Another way is to convert it to POSIXlt, add one to the mday component and then convert back. No packages are used.
lt <- as.POSIXlt(xx$timestamp)
lt$mday <- lt$mday 1
as.POSIXct(lt)
## [1] "2022-11-05 01:00:01 UTC"
3) seq seq with by = "day" can be used. No packages are used.
do.call("c", lapply(xx$timestamp, function(x) seq(x, length = 2, by = "day")[2]))
## [1] "2022-11-05 01:00:01 UTC"
If we knew that there was only one element in timestamp it could be simplified to
seq(xx$timestamp, length = 2, by = "day")[2]
## [1] "2022-11-05 01:00:01 UTC"
4) lubridate The lubridate package supports adding days like this:
library(lubridate)
xx$timestamp days(1)
## [1] "2022-11-05 01:00:01 UTC"
Note
The input shown in the question is:
xx <- structure(list(timestamp = structure(1667523601, tzone = "UTC",
class = c("POSIXct", "POSIXt"))),
class = "data.frame", row.names = c(NA, -1L))
CodePudding user response:
With lubridate
library(tidyverse)
library(lubridate)
df %>%
mutate(
timestamp = timestamp %m % days(1)
)
# A tibble: 1 × 1
timestamp
<dttm>
1 2022-11-04 01:00:01
CodePudding user response:
With lubridate
you can add days with ... days(1)
.
library(tidyverse)
dd <- structure(list(timestamp = structure(1667523601, tzone = "UTC", class = c(
"POSIXct",
"POSIXt"
))), class = "data.frame", row.names = c(NA, -1L))
dd |> mutate(timestamp lubridate::days(1))
#> timestamp timestamp lubridate::days(1)
#> 1 2022-11-04 01:00:01 2022-11-05 01:00:01