R中向量长度的意外值

时间:2009-12-11 10:32:23

标签: r posixct

我有下面的字符向量

a = c("2009-07-31 18:00:33", "2009-07-31 18:00:38", "2009-07-31 18:00:43",  "2009-07-31 18:00:49", "2009-08-01 01:58:49", "2009-08-01 01:53:16",  "2009-08-01 08:04:13", "2009-08-01 16:16:13")

我想将其转换为时间对象,所以我这样做:

b = strptime(a, "%Y-%m-%d %H:%M:%S")

为什么a和b的长度不同?

> length(a)
[1] 8
> length(b)
[1] 9

3 个答案:

答案 0 :(得分:1)

对象b具有类POSIXltPOSIXlt个日期的数组总是返回9的长度, 因为它代表了九个向量的命名列表:

R> class(b)
[1] "POSIXt"  "POSIXlt"

R> unclass(b)
$sec
[1] 33 38 43 49 49 16 13 13
$min
[1]  0  0  0  0 58 53  4 16
$hour
[1] 18 18 18 18  1  1  8 16
$mday
[1] 31 31 31 31  1  1  1  1
$mon
[1] 6 6 6 6 7 7 7 7
$year
[1] 109 109 109 109 109 109 109 109
$wday
[1] 5 5 5 5 6 6 6 6
$yday
[1] 211 211 211 211 212 212 212 212
$isdst
[1] 1 1 1 1 1 1 1 1

POSIXct,表示自开始以来的(有符号)秒数 1970年作为数字向量,给出了预期的长度:

R> length(as.POSIXct(a))
[1] 8
R> unclass(as.POSIXct(a))
[1] 1.249e+09 1.249e+09 1.249e+09 1.249e+09 1.249e+09 1.249e+09 1.249e+09
[8] 1.249e+09
attr(,"tzone")
[1] ""

答案 1 :(得分:0)

正如您在?strptime中所看到的,它将字符串转换为类POSIXlt。在R中有两种类型的时间:POSIXltPOSIXct。 说明位于?DateTimeClasses,但是为了快捷方式:

  

类“POSIXct”表示自签名以来的(有符号)秒数   1970年初作为数字   矢量。

     

类“POSIXlt”是一个命名的   代表的向量列表   秒0-61:秒   min 0-59:minutes hour 0-23:hours mday 1-31:day   星期一0-11:第一个月后   那一年。自1900年以来的一年。   每周0-6天,开始   在星期天。 yday 0-365:一天   年。 isdst夏令时   旗。如果有效则为正,如果为零则为零   不,如果不知道则为负面。

所以你的b是9个向量的列表,每个向量8个长度。

你可以看到:

sapply(b,length)

您可以使用完全转换:

b_1 = as.POSIXlt(a, "%Y-%m-%d %H:%M:%S",tz="")
b_2 = as.POSIXct(a, "%Y-%m-%d %H:%M:%S",tz="")

length(b_1) # 9
length(b_2) # 8

答案 2 :(得分:0)

仅供记录,这个FAQ问题即将在R 2.11.0中更改:

  

2.11.0新功能

     

length(POSIXlt)现在返回长度   相应的摘要   timedate-vector而不是总是9   (基础清单的长度   结构体)。 (PR#14073和。的愿望)   PR#10507。)

这是来自12月2日的RSS提要输入,总结了Subversion存档中的每日更改,developer page有关提要的详细信息。