R 中向量长度的意外值

发布于 2024-08-14 04:02:56 字数 420 浏览 2 评论 0原文

我有下面的字符向量,

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

I have the character vector below

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")

I want to convert this to time objects so I do this:

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

Why do a and b have different lengths?

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

薄荷→糖丶微凉 2024-08-21 04:02:56

对象 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] ""

The object b has class POSIXlt. Arrays of POSIXlt dates always return a length of 9,
since the represent a named list of nine vectors:

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, which represents the (signed) number of seconds since the beginning of
1970 as a numeric vector, gives you the expected length:

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] ""
尝蛊 2024-08-21 04:02:56

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

“POSIXct”类表示自事件发生以来的(带符号)秒数
1970 年初作为数字
矢量。

“POSIXlt”类是一个命名的
表示的向量列表
秒 0–61:秒
min 0–59:分钟 小时 0–23:小时 mday 1–31:月份中的某天
mon 0–11:第一个之后的几个月
那一年。年 自 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

As you can see in ?strptime it converts character strings to class POSIXlt. In R there are two types of times: POSIXlt and POSIXct.
Description is in ?DateTimeClasses, but to shortcut:

Class "POSIXct" represents the (signed) number of seconds since the
beginning of 1970 as a numeric
vector.

Class "POSIXlt" is a named
list of vectors representing
sec 0–61: seconds
min 0–59: minutes hour 0–23: hours mday 1–31: day of the month
mon 0–11: months after the first of
the year. year Years since 1900.
wday 0–6 day of the week, starting
on Sunday. yday 0–365: day of the
year. isdst Daylight savings time
flag. Positive if in force, zero if
not, negative if unknown.

So your b is list of 9 vectors, 8-length each.

You can see:

sapply(b,length)

You could use exact conversion:

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
九厘米的零° 2024-08-21 04:02:56

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

2.11.0 新功能

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

这是 12 月 2 日 RSS 提要条目中的内容,总结了 Subversion 存档(开发人员页面)中的日常更改 有关提要的详细信息。

Just for the record, this FAQ issue is about to change in R 2.11.0:

2.11.0 NEW FEATURES

length(POSIXlt) now returns the length
of the corresponding abstract
timedate-vector rather than always 9
(the length of the underlying list
structure). (Wish of PR#14073 and
PR#10507.)

That's from the December 2 entry of the RSS feed summarising daily changes in the Subversion archive, the developer page for details about the feed.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文