1

我有下面的字符向量

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
4

3 回答 3

1

该对象b具有类POSIXlt。日期数组POSIXlt总是返回 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

Class 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] ""
于 2009-12-11T11:15:18.560 回答
0

如您所见,?strptime它将字符串转换为 class POSIXlt。在 R 中有两种类型的时间:POSIXltPOSIXct。说明在 中?DateTimeClasses,但要快捷方式:

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

“POSIXlt”类是一个命名的向量列表,表示 sec 0-61:秒 min 0-59:分钟 hour 0-23:小时 mday 1-31:一个月中的某天 mon 0-11:一年中的第一个月之后的月份. year 自 1900 年以来的年份。 wday 一周中的第 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
于 2009-12-11T11:21:18.673 回答
0

仅作记录,此常见问题解答问题即将在 R 2.11.0 中更改:

2.11.0 新功能

length(POSIXlt) 现在返回相应抽象时间日期向量的长度,而不是总是 9(底层列表结构的长度)。(PR#14073 和 PR#10507 的愿望。)

那是从 12 月 2 日的 RSS 提要条目中总结的 Subversion 存档中的每日更改,开发人员页面可以了解有关提要的详细信息。

于 2009-12-11T13:28:53.770 回答