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

时间:2016-11-20 01:07:05

标签: r csv datetime diff date-arithmetic

我正在使用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

现在的问题是我能够获得行的差异,但无法将这些值存储为列,然后将该列与其他相关列组合在一起。请帮我。提前谢谢。

2 个答案:

答案 0 :(得分:1)

考虑使用diff直接分配vapply变量。此外,不需要单独的 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))

答案 1 :(得分:1)

这是一个四线:

  1. 根据Specify custom Date format for colClasses argument in read.table/read.csv
  2. 为自定义日期时间定义自定义类&#39; myDate&#39;和转换器功能
  3. 将日期时间作为实际日期时间读入;不需要以后重复转换。
  4. 只需在日期列上使用矢量化diff运算符(它会看到它们的类型,并自动为POSIXct日期调度diff函数)。不需要for-loops:
  5. 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()生成的长度比我们差异化的向量的结果短一个。因此我们必须填充它(例如使用前导NA或任何你想要的东西)。