从POSIXct提取时间

我如何从一系列丢弃date部分的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")) 

这对应于这些date:

 "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的具体date。

有一个特定的function,可以让我做到这一点?

您可以使用strftime将date时间转换为任何字符格式:

 > 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元素,然后将相同的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" 

现在你可以在你的plot中使用这些datetime对象:

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

在这里输入图像说明


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

以前的答案显示了这个窍门。 在本质上:

  • 您必须保留POSIXcttypes以利用所有现有的绘图function

  • 如果你想在一个地块上覆盖几天的价值,突出日常的变化,最好的诀窍是…

  • 强加同一天(如果需要的话,也可以是月份,甚至是一年,这里不是这种情况)

您可以通过在POSIXlt表示中覆盖月份和月份组件,或者通过在不同date之间相对于0:00:00偏移“delta”来做到这一点。

所以有了你所提供的times和价值:

 ## 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 

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

在这里输入图像说明

我无法find与时钟时间完全相关的任何内容,所以我只是使用package中的一些函数:lubridate和使用seconds-since-midnight:

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

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

已经提供了许多解决scheme,但是我还没有看到这个使用包chron的解决scheme:

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

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

GMT午夜的time_t值始终可以被8640024 * 3600 )整除。 GMT以来的秒数,因此time %% 86400

格林威治(time %% 86400) / 3600的小时数是(time %% 86400) / 3600 ,这可以用作图的x轴:

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

在这里输入图像说明

要调整时区,请在调整时间之前调整模数,方法是加上时区在GMT之前的秒数。 例如,美国中央夏令时(CDT)比格林威治时间晚5个小时。 为了绘制CDT中的时间,使用以下expression式:

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