【问题标题】:Extract POSIXct information from large vector从大向量中提取 POSIXct 信息
【发布时间】:2025-12-13 23:45:01
【问题描述】:

我有一个包含 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 元素,但这不应该影响一般操作。任何关于如何绕过夏令时的提示都是一个不错的小插件!

你知道怎么做吗?

【问题讨论】:

  • 你可以使用像 lubridate 这样的包吗?如果您要显示您正在寻找的输出或至少前几行,这将有助于可视化您想要的内容。
  • 我不知道你是否明白 - 是的,我可以使用 lubridate,尽管我还没有使用它。有了输出,嗯,这就是我要找的。第二个输出向量如下所示:lbl_v2("01 Sep", "01 Oct", "01 Nov", [...], "01 Aug")。对于这 12 个元素中的每一个,我也在寻找它们存储在 v2 中的位置。这应该是一个数值向量,包含来自lbl_v2 的日期出现在v2 中的相应元素编号。

标签: r vector subset posixct


【解决方案1】:

我们可以从使用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"

【讨论】: