R 如何生成POSIXct的空向量

R 如何生成POSIXct的空向量,r,posixct,R,Posixct,我想创建一个空向量POSIXct,这样我就可以在其中放置一个POSIXct: vec <- vector("POSIXct", 10) vec vec[1] <- "2014-10-27 18:11:36 PDT" vec vec由于没有POSIX模式,因此不能单独使用vector()初始化POSIXct向量(有关所有模式类型的列表,请参见?mode) 但是我们可以使用.POSIXct从字符向量创建向量 (x <- .POSIXct(character(10))) ## th

我想创建一个空向量
POSIXct
,这样我就可以在其中放置一个
POSIXct

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

vec由于没有POSIX
模式
,因此不能单独使用
vector()
初始化
POSIXct
向量(有关所有模式类型的列表,请参见
?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" 

(x以以下方式创建POSIXct向量时,基础类型变为双精度:

> 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)
因此,我更喜欢使用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))

我通常将事物初始化为
NA

as.POSIXct(rep(NA, 10))
在这种情况下效果很好。它在@RichardScriven的回答中明确地做了幕后工作——请参阅此处的注释以进行更详细的讨论。

我会选择。我首先使用了,但后来在尝试计算非
NA
元素的差异时出错,如下面的示例所示


t1我为此使用以下函数。与其他解决方案非常类似

vector\u datetime vector\u datetime()
长度为0的POSIXct
>向量_日期时间(10)
[1] 娜娜娜娜娜娜娜娜娜娜娜娜
>类别(向量_日期时间(10))
[1] POSIXct“POSIXt”
这也可以通过
lubridate
完成

库(lubridate)
>as_日期时间(整数(0))
长度为0的POSIXct

也许我错过了上面的内容,但这确实是一个空的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) 

empty我喜欢初始化为
NA
as.POSIXct(rep(NA,10))
@Gregor-你想把它作为一个答案吗?我对结果的数学运算有一些合理的担心。这是我以前从未尝试过的。有趣的!+1这很好,但它依赖于
.POSIXct
中的解析错误。更简单(可能更清晰)的是
。POSIXct(rep(NA,10))
解析故障?不确定这意味着什么,
.POSIXct()
只是使用
结构()
。有很多方法。你也可以通过解析故障来执行
.POSIXct(NA[1:10])
我的意思是
字符(10)
生成一个包含10个空字符串的向量,而不是10个NA,因此生成的结构可以工作,因为“”以NA形式打印。
rep
解决方案生成一个逻辑向量,该向量将被提升为数值。这意味着像
x+3600
这样的操作将产生奇怪的错误。对于未来的观众,我会注意到我确实包含了
.POSIXct(整数(10))
可用于数学运算,尽管答案中未明确说明。
> .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"
as.POSIXct(rep(NA, 10))
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
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)