如何减去日期时间并将它们存储在单独的列中?
How to subtract datetimes and store them in a separate column?
我正在处理 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
现在的问题是我能够获取行的差异,但无法将这些值存储为一列,然后将该列与其他相关列组合。请帮我。提前致谢。
考虑使用 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))
这是四班轮:
- 根据 Specify custom Date format for colClasses argument in read.table/read.csv
定义自定义 class 'myDate' 和自定义日期时间的转换器函数
- 读入日期时间作为实际日期时间;以后不用再重复转换了。
- 只需在日期列上使用矢量化差异运算符(它会看到它们的类型,并自动为 POSIXct 日期调度差异函数)。不需要 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 的向量短一个。因此我们必须填充它(例如,用前导 NA,或任何你想要的)。
我正在处理 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
现在的问题是我能够获取行的差异,但无法将这些值存储为一列,然后将该列与其他相关列组合。请帮我。提前致谢。
考虑使用 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))
这是四班轮:
- 根据 Specify custom Date format for colClasses argument in read.table/read.csv 定义自定义 class 'myDate' 和自定义日期时间的转换器函数
- 读入日期时间作为实际日期时间;以后不用再重复转换了。
- 只需在日期列上使用矢量化差异运算符(它会看到它们的类型,并自动为 POSIXct 日期调度差异函数)。不需要 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 的向量短一个。因此我们必须填充它(例如,用前导 NA,或任何你想要的)。