当然,更优雅的解决方案(可以说)可以通过额外的包来实现。使用日期时,它是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
(当之无愧地被认为相当慢 - 请参阅为什么我的函数在 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
)
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