将小时转换为日期时间
问题描述:
我有一个带小时标和相应温度测量的数据框。测量结果随着时间的推移以随机间隔持续进行。我想将小时转换为相应的日期时间和温度。我的数据帧如下:(测量开始于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中包或函数的意见和提示,我可以看看这样做。谢谢你的时间。
答
在基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
(关闭的替代当然还可以使用cumsum
与diff
代替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=',')
答
您可以使用自定义日期格式与一些代码,检测到新的一天开始时,合并(假设第一测量发生在当天早些时候一次比一次测量前一天)。
# 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
是你的输入字符串还是浮点数? – jdweng
对不起,我不明白。如果询问时间,“09.25”是指9小时25分钟,即09:25 – MSNavin
他问的是“时间”是如何在您的数据框中实际格式化的。它是数字还是字符串?在你的例子中,你已经用两种不同的方式列出了'Time',例如'09.25'和'02:00'。请使用'dput'粘贴您的数据样本,或者至少向我们展示'str(mydata)'的输出。另外,在你的例子中,“时间”只包含一天的时间。日期从哪里来? – eipi10