从POSIXct提取时间

问题描述:

我将如何从一系列放弃日期部分的POSIXct对象中提取时间?从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的具体日期如何。

是否有一个特定的功能,可以让我做到这一点?

您可以使用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" 

但是,这并不很大帮助,因为你想展现您的数据。一个解决办法是从次剥离该日期元素,再以相同的日期添加到您的所有时间:

> 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") 

enter image description here


如需更多帮助,请参阅?DateTimeClasses

以前的答案显示了这个技巧。从本质上说:

  • 您必须保留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 

产生这种对比原始的和修改的时间尺度:

enter image description here

我无法找到任何与交易时钟正好,所以我只是使用一些函数从包:lubridate和工作与秒 - 自午夜:

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

然后,您可能需要查看一些轴代码以了解如何很好地标记轴。

+0

不错,我将不得不看看'lubridate',看起来像一个有趣的包。 – nico 2012-03-23 15:29:42

GMT午夜的time_t值始终可以被8640024 * 3600)整除。 GMT以后的秒数为time %% 86400

在GMT时间不(time %% 86400)/3600并且这可以用作图的x轴:

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

enter image description here

要调整的时区,取模量之前调整时间通过添加您的时区在GMT之前的秒数。例如,美国*夏令时(CDT)比格林尼治时间晚5个小时。暗算在CDT的时候,下面的表达式使用:已提供

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

许多解决方案,但我还没有看到这一个,它采用包代上:

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

(抱歉,我无权发布图片,你必须亲自绘制它)