如何仅绘制时间戳的时间部分,包括日期?
Posted
技术标签:
【中文标题】如何仅绘制时间戳的时间部分,包括日期?【英文标题】:How do I plot only the time portion of a timestamp including a date? 【发布时间】:2011-12-01 02:45:29 【问题描述】:所以我有一组这样的时间戳:
datetime<-c("2011-09-28 03:33:00", "2011-08-24 13:41:00", "2011-09-19 16:14:00", "2011-08-18 11:01:00", "2011-09-17 06:35:00", "2011-08-15 12:48:00")
我只想制作时间的直方图。我所做的是在空间拆分列以仅获取时间,然后转换回 POSIXct 对象以便 qplot 绘制它:
library(ggplot2, stringr)
qplot(as.POSIXct(strptime((str_split_fixed(as.character(time), " ", 2)[,2]), "%H:%M:%S")))
但是,as.POSIXct(strptime((str_split_fixed(as.character(datetime), " ", 2)[,2]), "%H:%M:%S"))
的输出是
"2011-10-04 03:33:00 PDT" "2011-10-04 13:41:00 PDT" "2011-10-04 16:14:00 PDT" "2011-10-04 11:01:00 PDT" "2011-10-04 06:35:00 PDT" "2011-10-04 12:48:00 PDT"
qplot 绘制了我想要的图,但这对我来说似乎是一个复杂的 hack。当然有更好的方法来做到这一点?我可以转换为纪元时间并绘制它,但我试图避免将其作为额外的步骤。
更大的问题是,“如何控制 strptime 的输出?”
【问题讨论】:
【参考方案1】:这种方法怎么样?
require("ggplot2")
dtstring <- c(
"2011-09-28 03:33:00", "2011-08-24 13:41:00", "2011-09-19 16:14:00",
"2011-08-18 11:01:00", "2011-09-17 06:35:00", "2011-08-15 12:48:00"
)
dtPOSIXct <- as.POSIXct(dtstring)
# extract time of 'date+time' (POSIXct) in hours as numeric
dtTime <- as.numeric(dtPOSIXct - trunc(dtPOSIXct, "days"))
p <- qplot(dtTime) + xlab("Time slot") + scale_x_datetime(format = "%S:00")
print(p)
dtPOSIXct - trunc(dtPOSIXct, "days")
的计算以小时为单位提取 POSIXct 类对象的时间。
对于ggplot2-0.9.1
:
require("ggplot2")
require("scales")
dtstring <- c(
"2011-09-28 03:33:00", "2011-08-24 13:41:00", "2011-09-19 16:14:00",
"2011-08-18 11:01:00", "2011-09-17 06:35:00", "2011-08-15 12:48:00"
)
dtPOSIXct <- as.POSIXct(dtstring)
# extract time of 'date+time' (POSIXct) in hours as numeric
dtTime <- as.numeric(dtPOSIXct - trunc(dtPOSIXct, "days"))
p <- qplot(dtTime) + xlab("Time slot") +
scale_x_datetime(labels = date_format("%S:00"))
print(p)
对于ggplot2-0.9.3.1
:
require("ggplot2")
require("scales")
dtstring <- c(
"2011-09-28 03:33:00", "2011-08-24 13:41:00", "2011-09-19 16:14:00",
"2011-08-18 11:01:00", "2011-09-17 06:35:00", "2011-08-15 12:48:00"
)
dtPOSIXct <- as.POSIXct(dtstring)
# extract time of 'date+time' (POSIXct) in hours as numeric
dtTime <- as.numeric(dtPOSIXct - trunc(dtPOSIXct, "days"))
class(dtTime) <- "POSIXct"
p <- qplot(dtTime) + xlab("Time slot") +
scale_x_datetime(labels = date_format("%S:00"))
print(p)
【讨论】:
谢谢,我没怎么用过 trunc。总有新东西要学! 我对某事感到困惑。我正在处理类似的情况,尽管观察次数刚刚超过 200 万。当我使用 format = "%S:00" 时,我只得到所有 X 轴标签的 00:00。我尝试更改为 %H (此函数的 S = 秒和 H = 小时),这也不对:X 轴从 17:00 开始,计数到 0:00 然后返回到18:00结束。 (标签在 25 小时内均匀分布。) 嗯,我想知道这是否与我在 CDT 有关,比格林威治标准时间晚 5 小时,而 POSIX 时间从格林威治标准时间 1970 年 1 月 1 日午夜开始计算?因此,如果我将 5 * 60 * 60 添加到每个值......不,从头开始。我现在在 CST,即 GMT-6。 -1 不知道你是怎么得到这个的,但我无法重现这个结果。正如@ArenCambre 提到的,所有x 轴标签都是00:00 我写了这篇文章(2011 年 10 月 5 日)。ggplot2
包已更新。对于ggplot2-0.9.1
,请尝试添加require("scales")
,并将format = "%S:00"
更改为labels = date_format("%S:00")
。【参考方案2】:
只需按预期使用基本工具即可:
dtstring <- c("2011-09-28 03:33:00", "2011-08-24 13:41:00", "2011-09-19 16:14:00", "2011-08-18 11:01:00", "2011-09-17 06:35:00", "2011-08-15 12:48:00")
datetime <- as.POSIXct(dtstring)
library(ggplot2)
qplot(datetime)
您的字符串格式是使用as.POSIXct
解析的默认格式,请参阅?strptime
了解详细信息或者如果您有此格式以外的其他内容。
如果您想从日期时间值中获得特定的字符串格式,请使用 format
,如
format(datetime, "%d-%b")
[1] "28-Sep" "24-Aug" "19-Sep" "18-Aug" "17-Sep" "15-Aug"
再次,请参阅?strptime
了解详情。如果您真的想丢弃时间值,可以使用 Date
类。请注意,日期时间或日期需要它们的完整结构,任何其他表示只是格式化文本。
qplot(as.Date(datetime))
【讨论】:
感谢您的回答,但它绘制了时间戳,而不仅仅是时间部分。我实际上是想去掉日期并绘制时间,所以 x 轴只会跨越 24 小时。 您的"%d-%b"
变量对应format
调用中的哪个关键字参数?我在?format
中找不到任何适合它的内容。以上是关于如何仅绘制时间戳的时间部分,包括日期?的主要内容,如果未能解决你的问题,请参考以下文章