balancePOSIXlt {base} | R Documentation |
Balancing “Ragged” and Out-of-range POSIXlt Date-Times
Description
Utilities to ‘balance’ objects of class "POSIXlt"
.
unCfillPOSIXlt(x)
is a fast primitive version of
balancePOSIXlt(x, fill.only=TRUE, classed=FALSE)
or equivalently,
unclass(balancePOSIXlt(x, fill.only=TRUE))
from where it is named.
Usage
balancePOSIXlt(x, fill.only = FALSE, classed = TRUE)
unCfillPOSIXlt(x)
Arguments
x |
an R object inheriting from |
fill.only |
a |
classed |
a |
“Ragged” and Out-of-range vs “Balanced” POSIXlt
Note that "POSIXlt"
objects x
may have their (9 to 11)
list components of different length
s, by simply
recycling them to full length. Prior to R 4.3.0, this has worked in
printing, formatting, and conversion to "POSIXct"
, but often
not for length()
, conversion to "Date"
or indexing,
i.e., subsetting, [
, or subassigning, [<-
.
Relatedly, components sec
, min
, hour
, mday
and mon
could have been out of their designated range (say, 0–23
for hours) and still work correctly, e.g. in conversions and printing.
This is supported as well, since R 4.3.0, at least when the values are
not extreme.
Function balancePOSIXlt(x)
will now return a version of the
"POSIXlt"
object x
which by default is balanced in both ways:
All the internal list components are of full length, and their values are
inside their ranges as specified in as.POSIXlt
's
‘Details on POSIXlt’.
Setting fill.only = TRUE
will only recycle the list components
to full length, but not check them at all. This is particularly faster
when all components of x
are already of full length.
Experimentally, balancePOSIXlt()
and other functions returning
POSIXlt
objects now set a logical
attribute
"balanced"
with NA
meaning “filled-in”, i.e.,
not “ragged” and TRUE
means (fully) balanced.
See Also
For more details about many aspects of valid POSIXlt
objects, notably
their internal list components, see ‘DateTimeClasses’, e.g.,
as.POSIXlt
, notably the section ‘Details on POSIXlt’.
Examples
## FIXME: this should also work for regular (non-UTC) time zones.
TZ <-"UTC"
# Could be
# d1 <- as.POSIXlt("2000-01-02 3:45", tz = TZ)
# on systems (almost all) which have tm_zone.
oldTZ <- Sys.getenv('TZ', unset = "unset")
Sys.setenv(TZ = "UTC")
d1 <- as.POSIXlt("2000-01-02 3:45")
d1$min <- d1$min + (0:16)*20L
(f1 <- format(d1))
str(unclass(d1)) # only $min is of length > 1
df <- balancePOSIXlt(d1, fill.only = TRUE) # a "POSIXlt" object
str(unclass(df)) # all of length 17; 'min' unchanged
db <- balancePOSIXlt(d1, classed = FALSE) # a list
stopifnot(identical(
unCfillPOSIXlt(d1),
balancePOSIXlt(d1, fill.only = TRUE, classed = FALSE)))
str(db) # of length 17 *and* in range
if(oldTZ == "unset") Sys.unsetenv('TZ') else Sys.setenv(TZ = oldTZ)