从POSIXct提取时间


82

我将如何从一系列POSIXct对象中提取时间并丢弃日期部分?

例如,我有:

times <- structure(c(1331086009.50098, 1331091427.42461, 1331252565.99979, 
1331252675.81601, 1331262597.72474, 1331262641.11786, 1331269557.4059, 
1331278779.26727, 1331448476.96126, 1331452596.13806), class = c("POSIXct", 
"POSIXt"))

对应于以下日期:

"2012-03-07 03:06:49 CET" "2012-03-07 04:37:07 CET" 
"2012-03-09 01:22:45 CET" "2012-03-09 01:24:35 CET" 
"2012-03-09 04:09:57 CET" "2012-03-09 04:10:41 CET"
"2012-03-09 06:05:57 CET" "2012-03-09 08:39:39 CET"
"2012-03-11 07:47:56 CET" "2012-03-11 08:56:36 CET"

现在,我有一些在那时测量的参数值

val <- c(1.25343125e-05, 0.00022890575, 
         3.9269125e-05, 0.0002285681875, 
         4.26353125e-05, 5.982625e-05, 
         2.09575e-05, 0.0001516951251, 
         2.653125e-05, 0.0001021391875)

我想绘制val与一天中的时间的关系图,而与测量val的具体日期无关。

是否有允许我执行此操作的特定功能?

Answers:


115

您可以strftime用来将日期时间转换为任何字符格式:

> t <- strftime(times, format="%H:%M:%S")
> t
 [1] "02:06:49" "03:37:07" "00:22:45" "00:24:35" "03:09:57" "03:10:41"
 [7] "05:05:57" "07:39:39" "06:47:56" "07:56:36"

但这并没有太大帮助,因为您想绘制数据。一种解决方法是从您的时间中删除date元素,然后为所有时间添加相同的日期:

> xx <- as.POSIXct(t, format="%H:%M:%S")
> xx
 [1] "2012-03-23 02:06:49 GMT" "2012-03-23 03:37:07 GMT"
 [3] "2012-03-23 00:22:45 GMT" "2012-03-23 00:24:35 GMT"
 [5] "2012-03-23 03:09:57 GMT" "2012-03-23 03:10:41 GMT"
 [7] "2012-03-23 05:05:57 GMT" "2012-03-23 07:39:39 GMT"
 [9] "2012-03-23 06:47:56 GMT" "2012-03-23 07:56:36 GMT"

现在,您可以datetime在绘图中使用这些对象:

plot(xx, rnorm(length(xx)), xlab="Time", ylab="Random value")

在此处输入图片说明


有关更多帮助,请参见 ?DateTimeClasses


15

以前的答案已经显示出窍门。在本质上:

  • 您必须保留POSIXct类型以利用所有现有的绘图功能

  • 如果您想在一张图上“叠加”几天的价值,以突出显示日内变化,那么最好的技巧也是...

  • 施加同一天(如果需要,甚至是月份,甚至是年份),此处不是这种情况

您可以通过在POSIXlt表示时覆盖月份中的月和月组成部分,或者仅在不同日期之间相对于0:00:00偏移“增量”来执行此操作。

因此,与timesval作为有益您提供:

## impose month and day based on first obs
ntimes <- as.POSIXlt(times)    # convert to 'POSIX list type'
ntimes$mday <- ntimes[1]$mday  # and $mon if it differs too
ntimes <- as.POSIXct(ntimes)   # convert back

par(mfrow=c(2,1))
plot(times,val)   # old times
plot(ntimes,val)  # new times

与原始时间尺度和修改后的时间尺度形成对比:

在此处输入图片说明


9

data.table软件包具有功能“ as.ITime”,可以在以下位置有效地使用此功能:

library(data.table)
x <- "2012-03-07 03:06:49 CET"
as.IDate(x) # Output is "2012-03-07"
as.ITime(x) # Output is "03:06:49"

4

我找不到与时钟时间完全相关的任何东西,所以我只使用package:lubridate中的一些功能,并与seconds-since-midnight一起使用:

require(lubridate)
clockS = function(t){hour(t)*3600+minute(t)*60+second(t)}
plot(clockS(times),val)

然后,您可能需要查看一些轴代码,以弄清楚如何更好地标记轴。


很好,我将不得不看一下lubridate,似乎是一个有趣的程序包。
nico 2012年

4

提供了许多解决方案,但是我没有看到使用包chron的解决方案:

hours = times(strftime(times, format="%T"))
plot(val~hours)

(对不起,我无权发布图片,您必须自己绘制)


3

time_t格林尼治标准时间86400(GMT)的值始终可以被(24 * 3600)整除。因此,格林尼治标准时间以来(秒)的值为time %% 86400

GMT中的小时为(time %% 86400) / 3600,可以用作绘图的x轴:

plot((as.numeric(times) %% 86400)/3600, val)

在此处输入图片说明

要调整时区,请在获取模数之前调整时间,方法是增加时区领先GMT的秒数。例如,美国中央夏令时(CDT)比格林尼治标准时间晚5小时。要针对CDT中的时间进行绘制,使用以下表达式:

plot(((as.numeric(times) - 5*3600) %% 86400)/3600, val)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.