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 datetime
object 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, anytime
vergelijken 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