R- 在日期字段上创建一个应用条件的新字段

R- Create a new field applying condition on a Date field

我是 R 的新手。我正在使用 windows10。我有 R Studio 和 R 版本 3.5.0。

我有一个 table 具有一个字段日期时间格式。

2012-02-02 10:04:00
2012-08-13 11:38:00
2012-07-13 14:00:00
2012-09-26 08:45:00
2012-10-24 05:39:00
2012-02-03 03:33:00
2012-05-02 06:30:00
2012-06-27 09:00:00
2012-07-09 10:16:00
2012-11-22 13:13:00

我需要创建一个新字段来拆分夏季和冬季的数据: 五月到九月是夏季,十月到四月是冬季。根据这个新字段的结果,创建另一个字段来分隔一天中不同时间的数据:夏季的早上、中午、下午和晚上,冬季也是如此。条件为:

夏季
     *  Morning Summer: 5 am – 10 am 
     *  Noon Summer: 10 am -12 pm 
     *  Afternoon Summer: 12 pm -8 pm 
     *  Night summer 8 pm – 5 am 
冬天
     *  Morning Winter: 7 am – 11 am 
     *  Noon Winter: 11 am -12 pm 
     *  Afternoon Winter: 12 pm -4 pm 
     *  Night Winter 4 pm – 7 am

结果会是这样的:

 date                 | season |    time Of Day
'2012-02-02 10:04:00' | winter | morning
'2012-08-13 11:38:00' | summer | noon
'2012-07-13 14:00:00' | summer | afternoon
'2012-09-26 08:45:00' | summer | morning
'2012-10-24 05:39:00' | winter | night
'2012-02-03 03:33:00' | winter | night
'2012-05-02 06:30:00' | summer | morning
'2012-12-27 09:00:00' | winter | morning
'2012-07-09 10:16:00' | summer | morning
'2012-11-22 13:13:00' | winter | afternoon 

对于第一种情况,(分为夏季和冬季)我尝试使用 case_when,但没有成功:

df %>% 
  mutate(season = case_when(
    month(.$date) > 4 & month(.$date)< 10 ~ "summer",
    month(.$date) < 5 & month(.$date) > 10 ~ "winter"
    ))
Error in mutate_impl(.data, dots) : 
  Evaluation error: do not know how to convert 'x' to class 
<U+0093>POSIXlt<U+0094>.

我试图找到有关该错误的信息,但老实说我不知道​​如何解决该问题。我尝试使用库 "lubridate" 但仍然无效。

知道怎么做吗?

 df %>% mutate_if(is.character, as.POSIXct) %>% 
          mutate(season = case_when(
                          month(date) > 4 & month(date) < 10 ~ "summer",
                          month(date) < 5 & month(date) > 10 ~ "winter"
        ))

数据

 data <- read.table(text="
                       date
               '2012-02-02 10:04:00'

               '2012-08-13 11:38:00'

               '2012-07-13 14:00:00'

               '2012-09-26 08:45:00'

              ",header=T, stringsAsFactors = F)