如何制作POSIXct的空向量

时间:2014-11-21 00:25:18

标签: r posixct

我想创建一个POSIXct的空向量,以便我可以在其中添加POSIXct

vec <- vector("POSIXct", 10)
vec
vec[1] <- "2014-10-27 18:11:36 PDT"
vec

这不起作用。有什么想法吗?

7 个答案:

答案 0 :(得分:20)

由于没有POSIX mode,您无法仅使用POSIXct初始化vector()向量(有关所有模式类型的列表,请参阅?mode)。

但我们可以使用.POSIXct从字符向量创建向量。

(x <- .POSIXct(character(10))) ## the same as .POSIXct(vector("character", 10))
# [1] NA NA NA NA NA NA NA NA NA NA
class(x)
# [1] "POSIXct" "POSIXt" 

另请注意,您还可以使用.POSIXct(integer(10))作为长度为10的原始日期时间向量。

答案 1 :(得分:5)

我通常会将内容初始化为NA

as.POSIXct(rep(NA, 10))

在这种情况下效果很好。它明确地在@ RichardScriven的答案中做了幕后发生的事情 - 看那里的评论进行更长时间的讨论。

答案 2 :(得分:1)

我会去Gregor's solution。我首先使用Rich Scriven's solution,但是后来尝试计算Non-NA元素的差异时遇到错误,如下例所示

t1 <- as.POSIXct("2014-10-27 18:11:36 PDT")
t2 <- as.POSIXct("2014-11-20 18:11:36 PDT")
x <- .POSIXct(character(10))
x[1] <- t1

difftime(t2, t1)
#R Time difference of 24 days

# fails
difftime(t2, x[1])
#R Error in unclass(time1) - unclass(time2) : 
#R   non-numeric argument to binary operator

unclass(x[1]) # character
#R [1] "1414429896"
unclass(t1)
#R [1] 1414429896
#R attr(,"tzone")
#R [1] ""

x <- .POSIXct(rep(NA_real_, 10))
x[1] <- t1
difftime(t2, x[1]) # all good
#R Time difference of 24 days

这甚至可能导致像这样的奇怪错误,可能需要一段时间才能发现

t1 <- as.POSIXct("2001-07-24 CEST")
t2 <- as.POSIXct("2002-08-29 CEST")
x <- .POSIXct(character(10))
x[1] <- t1

t2 < t1
#R [1] FALSE
t2 < x[1] # oh boy 
#R [1] TRUE

# the reason (I think)
unclass(t2)
#R [1] 1030572000
#R attr(,"tzone")
#R [1] ""
unclass(x[1])
#R [1] "995925600"

"995925600" > 1030572000
#R [1] TRUE

答案 3 :(得分:1)

这个问题现在有了一个非常简单的答案!

lubridate 允许您简单地编写,例如 empty_df <- tibble(date = POSIXct())

答案 4 :(得分:0)

以下列方式创建POSIXct向量时,基础类型变为double:

> times <- as.POSIXct(c("2015-09-18 09:01:05.984 CEST", "2015-09-18 10:01:10.984 CEST", "2015-09-18 10:21:20.584 CEST"))
> typeof(times)
[1] "double"
> values <- c(5,6,7)

将上面的向量与以字符作为基础类型初始化的POSIXct的空向量组合,得到一个字符-POSIXct向量:

> tm1 <- c(.POSIXct(character(0)), times)
> typeof(tm1)
[1] "character"

...无法直接绘制:

> ggplot() + geom_line(aes(x=tm1, y=val), data=data.frame(tm1,val))
geom_path: Each group consist of only one observation. Do you need to adjust the group aesthetic?

因此,我更喜欢使用double或integer作为基础类型初始化空的POSIXct向量:

> tm2 <- c(.POSIXct(double(0)), times)
> typeof(tm2)
[1] "double"
> ggplot() + geom_line(aes(x=tm2, y=val), data=data.frame(tm2,val))

Simple POSIXct plot

> tm3 <- c(.POSIXct(integer(0)), times)
> typeof(tm3)
[1] "double"
> ggplot() + geom_line(aes(x=tm3, y=val), data=data.frame(tm3,val))
#Same thing...

使用double时,矢量也会使用有效日期进行初始化(可能会或可能不会更好):

> .POSIXct(character(10))
 [1] NA NA NA NA NA NA NA NA NA NA
> .POSIXct(double(10))
 [1] "1970-01-01 01:00:00 CET" "1970-01-01 01:00:00 CET" "1970-01-01 01:00:00 CET" "1970-01-01 01:00:00 CET" "1970-01-01 01:00:00 CET" "1970-01-01 01:00:00 CET"
 [7] "1970-01-01 01:00:00 CET" "1970-01-01 01:00:00 CET" "1970-01-01 01:00:00 CET" "1970-01-01 01:00:00 CET"

答案 5 :(得分:0)

我为此使用以下功能。与其他解决方案非常相似。

Vector4f tempvec = new Vector4f(cube3f[i][j], 1.0f).mul(modelMatrix);

所以你可以做这样的事情。

vector_datetime <- function(n = 0L) structure(rep(NA_integer_, n), class = c("POSIXct", "POSIXt"))

这也可以通过> vector_datetime() POSIXct of length 0 > vector_datetime(10) [1] NA NA NA NA NA NA NA NA NA NA > class(vector_datetime(10)) [1] "POSIXct" "POSIXt" 完成。

lubridate

答案 6 :(得分:0)

也许我在上面错过了它,但这是一个真正空的 POSIXct:

as.POSIXct(integer())

例如,如果你想要一个空的数据框:

empty <- data.frame(date_time = as.POSIXct(integer()),
                    date = as.Date(x = integer(), origin = "1970-01-01"))
empty
[1] date_time date     
<0 rows> (or 0-length row.names)

str(empty)
'data.frame':   0 obs. of  2 variables:
 $ date_time: 'POSIXct' num(0) 
 - attr(*, "tzone")= chr ""
 $ date     : 'Date' num(0)