如何减去日期时间并将它们存储在单独的列中?

问题描述:

我与csv文件工作,我有名字“statistics_lastLocatedTime”一栏,如图 csv file image 我想从第一行减去“statistics_lastLocatedTime”第二行;如何减去日期时间并将它们存储在单独的列中?

##select related features 
data <- read.csv("D:/smart tech/store/2016-10-11.csv") 
(columns <- data[with(data, macAddress == "7c:11:be:ce:df:1d"), 
    c(2,10,11,38,39,48,50) ]) 
write.csv(columns, file = "updated.csv", row.names = FALSE) 

## take time difference 
date_data <- read.csv("D:/R/data/updated.csv") 
(dates <- date_data[1:40, c(2)]) 
NROW(dates) 
for (i in 1:NROW(dates)) { 
    j <- i+1 
    r1 <- strptime(paste(dates[i]),"%Y-%m-%d %H:%M:%S") 
    r2 <- strptime(paste(dates[j]),"%Y-%m-%d %H:%M:%S") 
    diff <- as.numeric(difftime(r1,r2)) 
    print (diff) 
} 

## combine time difference with other related columns 
combine <- cbind(columns, diff) 
combine 

现在的问题:从第二行等等,直到最后一排,然后存储在单独的列中的所有这些差异,则此列结合其他相关栏目如下面的代码中给出的第三排是我能够获得行的差异,但无法将这些值存储为列,然后将该列与其他相关列组合。请帮帮我。提前致谢。

+0

为什么要过滤'date_data'到前40行?这将无法再回到'列'。 – Parfait

+0

实际上macAddress ==“7c:11:be:ce:df:1d”中的行总数只有40,如果我使用(日期

+0

您想计算'statistics_lastLocatedTime'中的差异,并将该向量存回数据帧。 – smci

这是一个四内衬:

  1. 定义自定义类“指明MyDate”,和一个转换器功能的自定义日期时间,根据Specify custom Date format for colClasses argument in read.table/read.csv
  2. 在日期时间中读取为实际日期时间;不需要以后重复转换。
  3. 只需在日期列上使用矢量化的diff运算符(它会看到它们的类型,并自动为POSIXct日期分派diff函数)。不需要for循环:

setClass('myDate') # this is not strictly necessary 
setAs('character','myDate', function(from) { 
    as.POSIXct(from, format='%d-%m-%y %H:%S', tz='UTC') # or whatever timezone 
}) 

data <- read.csv("D:/smart tech/store/2016-10-11.csv", 
      colClasses=c('character','myDate','myDate','numeric','numeric','integer','factor')) 
# ... 
data$date_diff <- c(NA, diff(data$statistics_lastLocatedTime)) 

注意diff()产生一个长度比我们diff'ed矢量更短的结果。因此,我们必须填补它(例如,带领先的NA,或任何你想要的)。

+0

很好的答案!我将'setAs()'添加到我的库中。但是,您可能需要添加'setClass('myDate')'否则错误:*没有定义类“myDate”*。我怎么错过'diff()'?请确保在colClasses中修复* integer *的结尾引号。 – Parfait

+0

@Parfait不,我们不需要添加'setClass('myDate')'。它工作正常,没有 – smci

+1

原来这是一个警告,而不是一个错误,但仍然处理这个问题表明:http://*.com/questions/14146341/using-setas-to-specify-colclasses-in-r – Parfait

考虑直接使用vapply分配diff变量。此外,不需要单独的date_data df,因为所有操作都可以在 df上运行。此外还应注意在时间格式的变化在数据帧目前对齐格式:

columns$diff <- vapply(seq(nrow(columns)), function(i){  
    r1 <- strptime(paste(columns$statistics_lastLocatedTime[i]),"%d-%m-%y %H:%M") 
    r2 <- strptime(paste(columns$statistics_lastLocatedTime[i+1]),"%d-%m-%y %H:%M") 

    diff <- difftime(r1, r2)  
}, numeric(1))