92

如何从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 的具体日期无关。

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

4

7 回答 7

125

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

在此处输入图像描述


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

于 2012-03-23T12:52:51.440 回答
17

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

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

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

在此处输入图像描述

于 2012-03-23T12:53:44.950 回答
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"
于 2018-11-20T16:21:12.440 回答
8

对于那些寻找 tidyverse 方法从 POSIXct 对象中提取 hh:mm::ss.sssss 的人来说,这是一个更新。请注意,时区不包含在输出中。

library(hms)
as_hms(times)
于 2020-12-02T22:32:10.087 回答
5

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

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

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

于 2015-05-06T13:29:49.703 回答
4

我找不到任何可以准确处理时钟时间的东西,所以我只使用 package:lubridate 中的一些函数并使用 seconds-since-midnight:

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

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

于 2012-03-23T12:57:00.187 回答
4

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

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

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

在此处输入图像描述

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

plot(((as.numeric(times) - 5*3600) %% 86400)/3600, val)
于 2014-05-27T02:47:35.337 回答