R 将小时转换为日期时间

R 将小时转换为日期时间,r,datetime,R,Datetime,我有一个带有小时戳的数据框,并测量了相应的温度。测量以随机间隔连续进行。我想将小时数转换为相应的日期、时间和测量的温度。我的数据框架如下:(测量始于2016年5月20日) 我想创建一个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

我有一个带有小时戳的数据框,并测量了相应的温度。测量以随机间隔连续进行。我想将小时数转换为相应的日期、时间和测量的温度。我的数据框架如下:(测量始于2016年5月20日)

我想创建一个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中的包或函数的任何评论和提示,我可以看看如何做。感谢您的时间。

base R中可能的解决方案:

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

带有
data.table
(当然,您也可以将
cumsum
diff
一起使用,而不是
rleid
shift
):

这两者都会得到相同的结果


使用数据:

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=',')

df您可以使用自定义日期格式,并结合一些代码来检测新的一天开始的时间(假设第一次测量发生在当天早于前一天的最后一次测量)

#开始日期
开始日期=“2016-05-20”
values=read.csv('values.txt',colClasses=c(“字符”,NA))
last=c(0,值$Time[1:nrow(值)-1])

day=cumsum(值$times是您的输入字符串还是浮点数?对不起,我不明白。如果您询问时间,“09.25”指9小时25分钟,即09:25。他询问
时间
在您的数据框中实际是如何格式化的。它是数字还是字符串?在您的示例中,您以两种不同的方式列出了
时间
,例如
09.25
02:00
。请使用
dput
粘贴到您的数据样本中,或者至少向我们显示时间的输出f
str(mydata)
。此外,在您的示例中,
时间
只包含一天中的一个时间。日期来自何处?哦,是的,很抱歉格式错误。我编辑了时间。时间戳是数字。提到的日期是测量的实际开始日期。如果我理解正确,您希望将相应的日期分配给var可使用的时间和温度?
> 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
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]
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