R tick data: datum en tijd samenvoegen tot een enkel object

Ik werk momenteel in tick-gegevens met R en ik wil datum en tijd samenvoegen tot één object, omdat ik een nauwkeurig tijdobject nodig heb om statistieken over mijn gegevens te berekenen. Zo zien mijn gegevens eruit:

              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

Eigenlijk wil ik de kolommen “datum” en “tijd” samenvoegen tot één enkele.


Antwoord 1, autoriteit 100%

Maak een datetimeobject met 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"

Antwoord 2, autoriteit 16%

Natuurlijk is een elegantere oplossing (aantoonbaar) mogelijk met een extra pakket. Bij het werken met datums is het lubridatepakket:

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

zou POSIXltvector moeten produceren.

UPDATE:

Er is een andere oplossing die gebruikmaakt van een algemeen datum- en tijdconversiepakket anytime(gebaseerd op de C++-bibliotheek Boost date_time):

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

Inderdaad, anytimevergelijken met zowel base R als lubridate(terecht beschouwd als nogal traag – zie Waarom zijn mijn functies op smeerdatums zo traag?) C++ (anytime) wint:

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

Other episodes