How to classify a given date/time by the season (e.g. summer, autumn)

后端 未结 1 1672
南方客
南方客 2020-12-17 07:51

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         


        
相关标签:
1条回答
  • 2020-12-17 08:37

    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))
    
    0 讨论(0)
提交回复
热议问题