2017-07-31 17 views
1

我有以下中的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

e.g船舶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'

+0

沒有日期,你怎麼知道船是遲到還是早?例如星期六可能在星期日之前和之後(取決於日期)。即使這是一週時間(是嗎?),我會認爲星期六是在星期日之後,而不是在它之前(與你的例子不同)。 –

+0

有可能找出它是按時還是按時...不可能通過使用給定的數據框找出早期或延遲。當你將日​​期與時間,從時間到時間。那麼你將能夠得到你想要的輸出... –

+0

如何找到唯一的時間或時間? – Neil

回答

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 
+0

你可以解釋一下加入'berth_day'和'berth_time'的邏輯嗎 – Neil

+0

Value在'chron'時間對象基本上是第二種格式的一部分。例如,如果你想在'time = 06:50:00'中增加1秒,那麼你需要執行'new_time = time +(1 /(24 * 60 * 60))',new_time變成'06:50: 01'。希望它能回答你的問題! – Prem

+0

例如我的船已經抵達'星期一',服務窗口從'星期六'到'星期日',但根據您的代碼顯示'早期'實際上它應該'延遲'。我們怎樣才能納入呢? – Neil