R记号数据:将日期和时间合并到单个对象中
我目前正在使用R处理tick数据,我想将日期和时间合并到一个对象中,因为我需要一个精确的时间对象来计算数据的一些统计信息。以下是我的数据的外观:R记号数据:将日期和时间合并到单个对象中,r,statistics,time-series,finance,R,Statistics,Time Series,Finance,我目前正在使用R处理tick数据,我想将日期和时间合并到一个对象中,因为我需要一个精确的时间对象来计算数据的一些统计信息。以下是我的数据的外观: 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 XXH1
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
基本上,我希望将“日期”和“时间”列合并为一个列。使用
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"
当然,更优雅的解决方案(可以说)可以通过额外的包实现。处理日期时,它是润滑包:
library(lubridate)
with(x, ymd(date) + hms(time))
应该生成POSIXlt向量
更新:
使用通用日期和时间转换包的另一个解决方案<代码>任意时间< /C> >(基于C++库):
<>实际上,比较C++和<代码> > LuBuffe< /Cord>(值得考虑的是慢看)C++(<代码>任意时间< /代码>)获胜:如果您指定了哪些统计信息,可能会有人提出比合并日期和时间更好的解决方案。@user1474263如果答案回答了您的问题,您应该单击此答案上的复选标记。可以说,在R中使用专用包的方式总是更优雅的—在本例中是lubridate.或使用(x,as.POSIXct(粘贴(日期,时间)))根据我的经验,
ymd
和hms
比手动提供格式的其他选项慢得多。因此,在处理大数据时,我建议使用as.POSIXct
(或fastpime::fastPOSIXct
)。添加了anytime
解决方案,其基准测试显示anytime
运行最快。
library(anytime)
with(x, anytime(paste(date, time)))
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