R刻度数据:将日期和时间合并到一个对象中

Posted

技术标签:

【中文标题】R刻度数据:将日期和时间合并到一个对象中【英文标题】:R tick data : merging date and time into a single object 【发布时间】:2012-07-21 11:53:13 【问题描述】:

我目前正在使用 R 处理刻度数据,我想将日期和时间合并到一个对象中,因为我需要获得一个精确的时间对象来计算我的数据的一些统计信息。这是我的数据的样子:

               date       time      price flag    exchange
2   XXH10   2010-02-02   08:00:03   2787 1824        E
3   XXH10   2010-02-02   08:00:04   2786    3        E
4   XXH10   2010-02-02   08:00:04   2787    6        E
5   XXH10   2010-02-02   08:00:04   2787    1        E
6   XXH10   2010-02-02   08:00:04   2787    1        E

基本上,我想将“日期”和“时间”列合并为一个。

【问题讨论】:

如果您指定哪些统计信息,有人可能会提出比合并日期和时间更好的解决方案。 【参考方案1】:

使用as.POSIXct 创建一个datetime 对象:

as.POSIXct(paste(x$date, x$time), format="%Y-%m-%d %H:%M:%S")
[1] "2010-02-02 08:00:03 GMT" "2010-02-02 08:00:04 GMT" "2010-02-02 08:00:04 GMT"
[4] "2010-02-02 08:00:04 GMT" "2010-02-02 08:00:04 GMT"

【讨论】:

@user1474263 如果它回答了您的问题,您应该单击此答案上的复选标记。 可以说,在 R 中总是有更优雅的方式使用专门的包 - 在这种情况下是 lubridate 或者只是with(x, as.POSIXct(paste(date, time)))【参考方案2】:

当然,更优雅的解决方案(可以说)可以使用额外的包。使用日期时,它是 lubridate 包:

library(lubridate)

with(x, ymd(date) + hms(time))

应该产生POSIXlt向量。

更新:

还有另一种使用通用日期时间转换包anytime(基于C++库Boost date_time)的解决方案:

 library(anytime)

 with(x, anytime(paste(date, time)))

确实,将anytime 与基本 R 和 lubridate 进行比较(理所当然地认为相当慢 - 请参阅 Why are my functions on lubridate dates so slow?)C++ (anytime) 胜出:

 x = read.csv(text = 'date,time
2010-02-02,08:00:03
2010-02-02,08:00:04
2010-02-02,08:00:04
2010-02-03,08:00:04
2010-02-04,08:00:05
2010-02-04,08:00:05
2010-02-04,08:00:06
2010-02-04,08:00:07
2010-02-04,08:00:08
2010-02-04,08:00:14')

 microbenchmark::microbenchmark(
   base = with(x, as.POSIXct(paste(date, time), format="%Y-%m-%d %H:%M:%S")),
   anytime = with(x, anytime::anytime(paste(date, time))),
   lubri = with(x, lubridate::ymd(date) + lubridate::hms(time)),
   times = 1000L
)
Unit: microseconds
  expr      min        lq       mean   median        uq        max  neval
 base       71.163   91.2555   104.38747  104.785  112.1185   256.997  1000
 anytime    40.508   52.5385   63.46973   61.843   68.5730    221.076  1000
 lubri      1596.490 1850.4400 2235.34254 1909.588 2033.096   110751.622  1000

【讨论】:

根据我的经验,ymdhms 比您手动提供格式的其他选项要慢得多。所以在处理大数据时,我会推荐as.POSIXct(或fasttime::fastPOSIXct)。 添加了anytime 解决方案,其基准显示anytime 运行速度最快。

以上是关于R刻度数据:将日期和时间合并到一个对象中的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JavaScript 日期对象转换为刻度

在 R 中,如何在显示日期的 x 轴上添加每月刻度线?

将日期列和时间列合并到日期时间

Highcharts 日期刻度位置隐藏删除

R-基于最近日期合并数据框

R:合并两个不规则时间序列