从大向量中提取 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 个元素,它们第一次出现时包含每个月的第一天。具体来说,我寻找:
- 这12个元素在
v2
中的数值位置有
- 这些元素的实际日期
%d %b
格式,例如“9 月 1 日”
这两个东西应该分开提取,即之后存储在两个不同的向量中。我认为 v1
和 v2
包含夏令时 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"
我有一个包含 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 个元素,它们第一次出现时包含每个月的第一天。具体来说,我寻找:
- 这12个元素在
v2
中的数值位置有 - 这些元素的实际日期
%d %b
格式,例如“9 月 1 日”
这两个东西应该分开提取,即之后存储在两个不同的向量中。我认为 v1
和 v2
包含夏令时 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"