I have a list of data with date/time information. Here is a sample:
Date.time
2012-12-20 19:28:00
2012-12-25 21:08:00
2012-12-29 02:50:00
201
Here are three possibilities, one using cut
, as suggested by @Spacedman in the comments, a second using findInterval
, and a third which uses a rolling join in data.table
. As discussed in the comments above, solstice and equinox dates are defined as onset of a Season. This may explain the difference between my output and OP:s (not yet edited) desired result. I leave the mapping of 'seas' to more sensible season names to you.
1. cut
Date.time$seastime <- as.POSIXct(cut(Date.time$datetime, seasonality$seastime))
Date.time <- merge(Date.time, seasonality)
Date.time[ , c("datetime", "seas")]
# datetime seas
# 1 2012-12-20 19:28:00 September Equinox
# 2 2012-12-25 21:08:00 December Solstice
# 3 2012-12-29 02:50:00 December Solstice
# snip
# 12 2013-03-12 02:24:00 December Solstice
# 13 2013-03-18 21:54:00 December Solstice
# 14 2013-03-24 04:50:00 March Equinox
# 15 2013-03-31 05:54:06 March Equinox
# 16 2013-04-01 03:52:00 March Equinox
# 17 2013-04-04 12:34:00 March Equinox
2. findInterval
seasonality <- seasonality[order(seasonality$seastime), ]
Date.time$seas <- seasonality$seas[findInterval(x = Date.time$datetime, vec = seasonality$seastime)]
Date.time
# datetime seas
# 1 2012-12-20 19:28:00 September Equinox
# 2 2012-12-25 21:08:00 December Solstice
# 3 2012-12-29 02:50:00 December Solstice
# snip
# 12 2013-03-12 02:24:00 December Solstice
# 13 2013-03-18 21:54:00 December Solstice
# 14 2013-03-24 04:50:00 March Equinox
# 15 2013-03-31 05:54:06 March Equinox
# 16 2013-04-01 03:52:00 March Equinox
# 17 2013-04-04 12:34:00 March Equinox
3. data.table
rolling join
library(data.table)
setDT(Date.time)
setDT(seasonality)
setkey(Date.time, datetime)
setkey(seasonality, seastime)
seasonality[Date.time, roll = Inf]
# seastime seas
# 1: 2012-12-20 19:28:00 September Equinox
# 2: 2012-12-25 21:08:00 December Solstice
# 3: 2012-12-29 02:50:00 December Solstice
# snip
# 12: 2013-03-12 02:24:00 December Solstice
# 13: 2013-03-18 21:54:00 December Solstice
# 14: 2013-03-24 04:50:00 March Equinox
# 15: 2013-03-31 05:54:06 March Equinox
# 16: 2013-04-01 03:52:00 March Equinox
# 17: 2013-04-04 12:34:00 March Equinox
# possibly rename 'seastime' here.
'Date.time' used here:
structure(list(datetime = structure(c(1356028080, 1356466080,
1356745800, 1357039920, 1357878240, 1360560720, 1360703160, 1361011320,
1361268360, 1361535000, 1361853000, 1363051440, 1363640040, 1364097000,
1364702046, 1364781120, 1365071640), class = c("POSIXct", "POSIXt"
), tzone = "")), .Names = "datetime", class = "data.frame", row.names = c(NA,
-17L))