我想创建一个POSIXct
的空向量,以便我可以在其中添加POSIXct
:
vec <- vector("POSIXct", 10)
vec
vec[1] <- "2014-10-27 18:11:36 PDT"
vec
这不起作用。有什么想法吗?
答案 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))
> 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)