从大向量中提取 POSIXct 信息

Extract POSIXct information from large vector

我有一个包含 438000 个元素的大型 POSIXct 向量 v2,创建如下:

t.start <- as.POSIXct("2016-08-16 15:00:00 CEST")
v1 <- seq(from = t.start, length.out = 2920, by = "3 hours")
v2 <- rep(v1, each = 150)

v2 中,我想提取 12 个元素,它们第一次出现时包含每个月的第一天。具体来说,我寻找:

  1. 这12个元素在v2中的数值位置有
  2. 这些元素的实际日期 %d %b 格式,例如“9 月 1 日”

这两个东西应该分开提取,即之后存储在两个不同的向量中。我认为 v1v2 包含夏令时 POSIXct 元素,但这不应该影响一般操作。关于如何绕过夏令时的任何提示都将是一个不错的小插件!

知道怎么做吗?

我们可以从使用 format(v2, "%d) 从每个元素中提取天数开始。然后,为了确定一个月的第一天在哪里,我们可以将其等同于 "01"。然后我们可以采用该逻辑向量的 diff(),记住在前面连接 0L 以说明缺少的第一个元素。将其包装在 which() 中,您将获得每个第一天的第一个元素的索引。

w <- which(c(0L, diff(format(v2, "%d") == "01")) == 1L)
w
# [1]  18451  54451  91651 127801 165001 202201 235801 272851
# [9] 308851 346051 382051 419251

现在 w 保存了我们需要的 12 个元素的位置。让我们看一下 v2 的那些元素,以确认我们做对了。

v2[w]
#  [1] "2016-09-01 00:00:00 PDT" "2016-10-01 00:00:00 PDT"
#  [3] "2016-11-01 00:00:00 PDT" "2016-12-01 02:00:00 PST"
#  [5] "2017-01-01 02:00:00 PST" "2017-02-01 02:00:00 PST"
#  [7] "2017-03-01 02:00:00 PST" "2017-04-01 00:00:00 PDT"
#  [9] "2017-05-01 00:00:00 PDT" "2017-06-01 00:00:00 PDT"
# [11] "2017-07-01 00:00:00 PDT" "2017-08-01 00:00:00 PDT"

看起来不错。请注意,我们在那里有一些凌晨 2 点的条目,这很好,因为现在是夏令时。现在让我们开始你想要的格式......

format(v2[w], "%d %b")
# [1] "01 Sep" "01 Oct" "01 Nov" "01 Dec" "01 Jan" "01 Feb"
# [7] "01 Mar" "01 Apr" "01 May" "01 Jun" "01 Jul" "01 Aug"