首页 文章

从POSIXct中提取时间

提问于
浏览
68

如何从丢弃日期部分的一系列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的具体日期 .

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

6 回答

  • 3

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

  • 6

    以前的答案显示了这个伎俩 . 在本质上:

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

    • 如果你想在一个地块上“叠加”好几天,突出每日内变化,最好的伎俩也是......

    • 强制当天(如果需要的话,还有月份甚至是年份,这不是这里的情况)

    您可以通过在 POSIXlt 表示中覆盖日期和月份组件来执行此操作,或者仅通过在不同日期之间相对于0:00:00偏移'delta'来执行此操作 .

    所以 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

  • 14

    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"
    
  • 3

    我找不到任何完全符合时钟时间的东西,所以我只使用包中的一些函数:lubridate并使用秒 - 从午夜开始:

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

    然后,您可能需要查看一些轴代码,以确定如何很好地标记轴 .

  • 93

    午夜GMT的 time_t 值始终可被 8640024 * 3600 )整除 . 因此,自格林威治标准时间午夜起的秒数值为 time %% 86400 .

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

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

    enter image description here

    要调整时区,请通过添加您的时区超前GMT的秒数来调整模数前的时间 . 例如,美国中央夏令时(CDT)比GMT晚5个小时 . 要在CDT中绘制时间,请使用以下表达式:

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

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

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

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

相关问题