2015-10-18 81 views
0

我在考慮如何根據時間查找日期(表中不存在日期)。基於時間的查找日期

例如:記住,我只是有時間

time = c("9:44","15:30","23:48","00:30","05:30", "15:30", "22:00", "00:45") 

我知道的事實,開始日期是2014年8月28日,但我如何才能在午夜之後更改日期。

預期的結果將是

9:44 2014-08-28 
15:30 2014-08-28 
23:48 2014-08-28 
00:30 2014-08-29 
05:30 2014-08-29 
15:30 2014-08-29 
22:00 2014-08-29 
00:45 2014-08-30 
+0

歡迎SO!你有什麼嘗試,沒有奏效?請(還)看看[如何製作一個很好的可重現問題](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)。 – hrbrmstr

回答

0

這裏有一個辦法做到這一點:

time = c("9:44","15:30","23:48","00:30","05:30", "15:30", "22:00", "00:45") 
times <- sapply(strsplit(time, ":", TRUE), function(x) Reduce("+", as.numeric(x) * c(60, 1))) 
as.POSIXct("2014-08-28") + times + 60*60*24*cumsum(c(F, tail(times < lag(times), -1))) 
# [1] "2014-08-28 00:09:44 CEST" "2014-08-28 00:15:30 CEST" "2014-08-28 00:23:48 CEST" "2014-08-29 00:00:30 CEST" "2014-08-29 00:05:30 CEST" "2014-08-29 00:15:30 CEST" "2014-08-29 00:22:00 CEST" "2014-08-30 00:00:45 CEST" 
+0

感謝@luke。我有點複雜,但很棒的東西 –

3

下面是使用data.tableITime類,使您可以操縱時間的一個例子(在轉換time這一類你現在可以減去/添加分鐘/小時/等)。

library(data.table) 
time <- as.ITime(time) 
Date <- as.IDate("2014-08-28") + c(0, cumsum(diff(time) < 0)) 

data.table(time, Date) 
#  time  Date 
# 1: 09:44:00 2014-08-28 
# 2: 15:30:00 2014-08-28 
# 3: 23:48:00 2014-08-28 
# 4: 00:30:00 2014-08-29 
# 5: 05:30:00 2014-08-29 
# 6: 15:30:00 2014-08-29 
# 7: 22:00:00 2014-08-29 
# 8: 00:45:00 2014-08-30 
+0

謝謝@David Arenburg。會詳細介紹一下你的這部分代碼,即c(0,cumsum(diff(time)<0))是做什麼的?只是爲了我的理解。謝謝 –

+0

這是在時間向量的差異,並檢查它是否定的(這意味着一天已經改變),然後創建這些改變的累計和,以創建一個向量,將每個觀察分類到某一天。嘗試運行'c(0,cumsum(diff(time)<0))',看看你得到了什麼。之後,我將這個矢量添加到'「2014-08-28」'爲了創建一個日期序列。如果你想最終結果是一個單一的日期字符串,只需'as.POSIXct(time,Date)'或'as.POSIXct(paste(Date,time))'而不是'data.table(time,Date) ' –

0

您可以連接系統日期和時間並獲得結果。例如,在Oracle中,我們可以得到日期和時間:

to_char(sysdate,'DD-MM-RRRR')|| ' ' || To_char(sysdate,'HH:MIAM') 

這將導致例如。 2015年12月9日上午09時50

爲了您的需求,以此爲:

to_char(sysdate,'DD-MM-RRRR')|| ' 00:45' and so on. 
1

使用chron的包,我們假設以後的時間是在同一天和一個較早的時間是在第二天:

library(chron) 
date <- as.Date("2014-08-28") + cumsum(c(0, diff(times(paste0(time, ":00"))) < 0)) 
data.frame(time, date) 

捐贈:

time  date 
1 9:44 2014-08-28 
2 15:30 2014-08-28 
3 23:48 2014-08-28 
4 00:30 2014-08-29 
5 05:30 2014-08-29 
6 15:30 2014-08-29 
7 22:00 2014-08-29 
8 00:45 2014-08-30