2016-06-11 256 views
1

我有一個帶小時標和相應溫度測量的數據框。測量結果隨着時間的推移以隨機間隔持續進行。我想將小時轉換爲相應的日期時間和溫度。我的數據幀如下:(測量開始於20/05/2016)將小時轉換爲日期時間

Time, Temp 
09.25,28 
10.35,28.2 
18.25,29 
23.50,30 
01.10,31 
12.00,36 
02.00,25 

我想創建一個相應的日期,時間和溫度一data.frame象下面這樣:

Time, Temp 
2016-05-20 09:25,28 
2016-05-20 10:35,28.2 
2016-05-20 18:25,29 
2016-05-20 23:50,30 
2016-05-21 01:10,31 
2016-05-21 12:00,36 
2016-05-22 02:00,25 

我很感激任何關於R中包或函數的意見和提示,我可以看看這樣做。謝謝你的時間。

+0

是你的輸入字符串還是浮點數? – jdweng

+0

對不起,我不明白。如果詢問時間,「09.25」是指9小時25分鐘,即09:25 – MSNavin

+0

他問的是「時間」是如何在您的數據框中實際格式化的。它是數字還是字符串?在你的例子中,你已經用兩種不同的方式列出了'Time',例如'09.25'和'02:00'。請使用'dput'粘貼您的數據樣本,或者至少向我們展示'str(mydata)'的輸出。另外,在你的例子中,「時間」只包含一天的時間。日期從哪裏來? – eipi10

回答

1

在基R A可能的解決方案:

df$Time <- as.POSIXct(strptime(paste('2016-05-20', sprintf('%05.2f',df$Time)), format = '%Y-%m-%d %H.%M', tz = 'GMT')) 
df$Time <- df$Time + cumsum(c(0,diff(df$Time)) < 0) * 86400 # 86400 = 60 * 60 * 24 

其給出:

> df 
       Time Temp 
1 2016-05-20 09:25:00 28.0 
2 2016-05-20 10:35:00 28.2 
3 2016-05-20 18:25:00 29.0 
4 2016-05-20 23:50:00 30.0 
5 2016-05-21 01:10:00 31.0 
6 2016-05-21 12:00:00 36.0 
7 2016-05-22 02:00:00 25.0 

data.table(關閉的替代當然還可以使用cumsumdiff代替rleid & shift ):

setDT(df)[, Time := as.POSIXct(strptime(paste('2016-05-20', sprintf('%05.2f',Time)), format = '%Y-%m-%d %H.%M', tz = 'GMT')) + 
      (rleid(Time < shift(Time, fill = Time[1]))-1) * 86400] 

或者與dplyr

library(dplyr) 
df %>% 
    mutate(Time = as.POSIXct(strptime(paste('2016-05-20', 
              sprintf('%05.2f',Time)), 
            format = '%Y-%m-%d %H.%M', tz = 'GMT')) + 
      cumsum(c(0,diff(Time)) < 0)*86400) 

這都將給予同樣的結果。


使用的數據

df <- read.table(text='Time, Temp 
09.25,28 
10.35,28.2 
18.25,29 
23.50,30 
01.10,31 
12.00,36 
02.00,25', header=TRUE, sep=',') 
1

您可以使用自定義日期格式與一些代碼,檢測到新的一天開始時,合併(假設第一測量發生在當天早些時候一次比一次測量前一天)。

# starting day 
start_date = "2016-05-20" 

values=read.csv('values.txt', colClasses=c("character",NA)) 
last=c(0,values$Time[1:nrow(values)-1]) 
day=cumsum(values$Time<last) 

Time = strptime(paste(start_date,values$Time), "%Y-%m-%d %H.%M") 
Time = Time + day*86400 
values$Time = Time