如何比较r中的日期和时间

时间:2017-07-31 06:57:56

标签: r

我在R

中有以下数据框
 ship_no    berth_day     berth_time   from_day   to_day    from_time    to_time
  ABC       Saturday      19:00:00     Saturday   Sunday     23:00:00    23:00:00
  DEF       Saturday      14:00:00     Saturday   Sunday     13:00:00    04:00:00
  ABC       Tuesday       11:00:00     Saturday   Sunday     23:00:00    23:00:00

我想知道的是有多少船只延误了,这意味着有多少船只错过了他们的服务窗口。

service window for ship ABC is from Saturday 11:00 PM to Sunday 11:00 PM and service window for ship DEF is from Saturday 13:00 PM to Sunday 4:00 PM

例如,对于货物ABC,它已经到达Saturday并且它已经到达的时间是19:00,这不在窗口中。窗口从Saturday 23:00开始,所以它已经提前了。如此明智如果它已提前或延迟。

我想要的数据框是

 ship_no    berth_day     berth_time   from_day   to_day    from_time    to_time    Delay/Early
  ABC       Saturday      19:00:00     Saturday   Sunday     23:00:00    23:00:00     Early
  DEF       Saturday      14:00:00     Saturday   Sunday     13:00:00    04:00:00     On Time
  ABC       Tuesday       11:00:00     Saturday   Sunday     23:00:00    23:00:00     delay

berth_time,from_time and to_time is in character format

我们怎样才能在R?中做到这一点?

1 个答案:

答案 0 :(得分:0)

希望这有帮助!
假设 - 根据@Neil仅考虑1周的数据)

#Week start is Monday
library(chron)
df <- data.frame(ship_no=c('ABC','DEF','GHI'),
                 berth_day=c('Saturday','Saturday','Tuesday'),
                 berth_time=chron(times=c("19:00:00", "14:00:00", "11:00:00")),
                 from_day=c('Saturday','Saturday','Saturday'),
                 from_time=chron(times=c('23:00:00','13:00:00','23:00:00')),
                 to_day=c('Sunday','Sunday','Sunday'),
                 to_time=chron(times=c('23:00:00','04:00:00','23:00:00')))

dayCoding <- function(x){
  ifelse (x == 'Monday', 0, 
          ifelse(x == 'Tuesday', 1, 
                 ifelse(x == 'Wednesday', 2, 
                        ifelse(x == 'Thursday', 3, 
                               ifelse(x == 'Friday', 4, 
                                      ifelse(x == 'Saturday', 5, 
                                             6))))))
  }
df1 <- cbind(df[c(1,3,5,7)],apply(df[c(2,4,6)], 2, dayCoding))
df1$calc_berth_time = df1$berth_time + df1$berth_day
df1$calc_from_time = df1$from_time + df1$from_day
df1$calc_to_time = df1$to_time + df1$to_day

statusCal <- function(x,y,z){
  ifelse((x<y),'Early',
         ifelse((x>=y & x<=z),'On Time', 'Delayed'))
}
df1$status <- mapply(statusCal, df1$calc_berth_time, df1$calc_from_time, df1$calc_to_time)

final_df <- merge(df, df1[,c("ship_no","status")], by="ship_no")
final_df

输入:

  ship_no berth_day berth_time from_day from_time to_day  to_time
1     ABC  Saturday   19:00:00 Saturday  23:00:00 Sunday 23:00:00
2     DEF  Saturday   14:00:00 Saturday  13:00:00 Sunday 04:00:00
3     GHI   Tuesday   11:00:00 Saturday  23:00:00 Sunday 23:00:00

输出是:

ship_no berth_day berth_time from_day from_time to_day  to_time  status
1     ABC  Saturday   19:00:00 Saturday  23:00:00 Sunday 23:00:00   Early
2     DEF  Saturday   14:00:00 Saturday  13:00:00 Sunday 04:00:00 On Time
3     GHI   Tuesday   11:00:00 Saturday  23:00:00 Sunday 23:00:00   Early