如何独立于日期绘制 POSIXct objects / 时间戳?

How to plot POSIXct objects / timestamps independent of day?

我希望问题标题有意义。我正在使用 Google 表单收集一些数据。表格始终在下午 5 点到 7 点之间提交,但在不同的日期提交。我想在 x-axis 上绘制时间戳的 time 组件与表单中的其他一些值。我想确保所有时间图都在相同的 two-hour window 中结束(即下午 5 点到 7 点之间),而不管时间戳的 date 组成部分如何。

我已将回复下载为 CSV 格式,并且可以毫无问题地读取时间戳:

demo <- as.POSIXct(demo$Timestamp, format="%m/%d/%Y %H:%M:%S")

数据如下所示:

> demo
 [1] "2015-10-12 17:02:42 CEST" "2015-10-12 17:02:46 CEST" "2015-10-12 17:02:46 CEST"
 [4] "2015-10-12 17:02:50 CEST" "2015-10-12 17:02:52 CEST" "2015-10-12 17:02:55 CEST"
 [7] "2015-10-12 17:02:58 CEST" "2015-10-12 17:03:02 CEST" "2015-10-12 17:03:09 CEST"
[10] "2015-10-12 17:03:15 CEST" "2015-10-12 17:03:22 CEST" "2015-10-12 17:03:24 CEST"
[13] "2015-10-12 17:03:36 CEST" "2015-10-12 17:03:48 CEST" "2015-10-12 17:04:07 CEST"
[16] "2015-10-12 17:09:20 CEST"

我可以使用像这样简单的东西来绘制这些:

plot(demo, rnorm(length(demo)))

但我希望 x-axis 的范围是下午 5-7 点,我需要确保所有数据都绘制在 two-hour 范围内,与记录数据的日期无关在。如果我这样做:

startTime <- as.POSIXct("17:00:00", format="%H:%M:%S")
endTime <- as.POSIXct("19:00:00", format="%H:%M:%S")
plot(demo, rnorm(length(demo)), xlim=c(startTime, endTime), xaxt='n')
axis.POSIXct(1, at = seq(startTime, endTime, by="hour"), format = "%M", labels=c("17:00", "18:00", "19:00"))

我得到了正确的情节轮廓,但没有数据。这是因为 startTimeendTime 将被设置为当前日期。如果我明确使用使它们与 demo ...

中的数据相同
startTime <- as.POSIXct("10/12/2015 17:00:00", format="%m/%d/%Y %H:%M:%S")
endTime <- as.POSIXct("10/12/2015 19:00:00", format="%m/%d/%Y %H:%M:%S")

...数据完全按照我希望的方式显示在图中。

但是:我无法添加其他任何一天的数据点。有人可以向我解释我如何 manipulate/use POSIXct objects 剥离他们的 "date" 组件并将它们绘制在同一个图中?


出于测试目的,您可以复制此向量以重现我在上面发布的代码:

demo <- as.POSIXct(c("2015-10-12 17:02:42 CEST", "2015-10-12 17:02:46 CEST", "2015-10-12 17:02:46 CEST", "2015-10-12 17:02:50 CEST", "2015-10-12 17:02:52 CEST", "2015-10-12 17:02:55 CEST", "2015-10-12 17:02:58 CEST", "2015-10-12 17:03:02 CEST", "2015-10-12 17:03:09 CEST", "2015-10-12 17:03:15 CEST", "2015-10-12 17:03:22 CEST", "2015-10-12 17:03:24 CEST", "2015-10-12 17:03:36 CEST", "2015-10-12 17:03:48 CEST", "2015-10-12 17:04:07 CEST", "2015-10-12 17:09:20 CEST"))

您可以尝试使用 lubridate 获取小时和分钟,然后重新格式化回 POSIXct。这将起作用,因为 POSIXct 的默认来源是当前日期。

library(lubridate)
demo <- as.POSIXct(paste(hour(demo), minute(demo)), format = "%H %M")