R tick数据:将日期和时间合并为单个对象

mar*_*o89 36 statistics finance r time-series

我目前正在处理带有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
Run Code Online (Sandbox Code Playgroud)

基本上,我想将"date"和"time"列合并为一个.

And*_*rie 68

创建一个datetime对象as.POSIXct:

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"
Run Code Online (Sandbox Code Playgroud)

  • @ user1474263如果它回答了您的问题,您应该点击此答案的复选标记. (3认同)
  • 或者只是`with(x,as.POSIXct(paste(date,time)))` (2认同)

top*_*hef 12

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

library(lubridate)

with(x, ymd(date) + hms(time))
Run Code Online (Sandbox Code Playgroud)

应该产生POSIXlt向量。

更新:

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

 library(anytime)

 with(x, anytime(paste(date, time)))
Run Code Online (Sandbox Code Playgroud)

确实,anytime与基础 R 和lubridate(当之无愧地被认为相当慢 - 请参阅为什么我的函数在 lubridate 日期上如此缓慢?)相比,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
)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)

  • 根据我的经验,`ymd` 和 `hms` 比手动提供格式的其他选项慢得多。因此,在处理大数据时,我会推荐 `as.POSIXct`(或 `fasttime::fastPOSIXct`)。 (6认同)