Calulcate running difference of time using difftime on one column of timestamps

若如初见. 提交于 2019-12-23 05:05:27

问题


How would you calculate time difference of two consecutive rows of timestamps in minutes and add the result to a new column.

I have tried this:

data$hours <- as.numeric(floor(difftime(timestamps(data), (timestamps(data)[1]), units="mins")))

But only get difference from time zero and onwards.

Added example data with 'mins' column that I want to be added

timestamps                        mins
2013-06-23 00:00:00               NA
2013-06-23 01:00:00               60
2013-06-23 02:00:00               60
2013-06-23 04:00:00              120

回答1:


The code that you're using with the [1] is always referencing the first element of the timestamps vector.

To do what you want, you want to look at all but the first element minus all but the last element.

mytimes <- data.frame(timestamps=c("2013-06-23 00:00:00",
                                   "2013-06-23 01:00:00",
                                   "2013-06-23 02:00:00",
                                   "2013-06-23 04:00:00"),
                      mins=NA)
mytimes$mins <- c(NA, difftime(mytimes$timestamps[-1],
                               mytimes$timestamps[-nrow(mytimes)],
                               units="mins"))

What this code does is:

  1. Setup a data frame so that you will keep the length of the timestamps and mins the same.
  2. Within that data frame, put the timestamps you have and the fact that you don't have any mins yet (i.e. NA).
  3. Select all but the first element of timestamps mytimes$timestamps[-1]
  4. Select all but the last element of timestamps mytimes$timestamps[-nrow(mytimes)]
  5. Subtract them difftime (since they're well-formatted, you don't first have to make them POSIXct objects) with the units of minutes. units="mins"
  6. Put an NA in front because you have one fewer difference than you have rows c(NA, ...)
  7. Drop all of that back into the original data frame's mins column mytimes$mins <-



回答2:


Another option is to calculate it with this approach:

# create some data for an MWE
hrs <- c(0,1,2,4)

df <- data.frame(timestamps = as.POSIXct(paste("2015-12-17", 
                                            paste(hrs, "00", "00", sep = ":"))))

df
# timestamps
# 1 2015-12-17 00:00:00
# 2 2015-12-17 01:00:00
# 3 2015-12-17 02:00:00
# 4 2015-12-17 04:00:00

# create a function that calculates the lag for n periods
lag <- function(x, n) c(rep(NA, n), x[1:(length(x) - n)])

# create a new column named mins
df$mins <- as.numeric(df$timestamps - lag(df$timestamps, 1)) / 60

df
# timestamps mins
# 1 2015-12-17 00:00:00   NA
# 2 2015-12-17 01:00:00   60
# 3 2015-12-17 02:00:00   60
# 4 2015-12-17 04:00:00  120


来源:https://stackoverflow.com/questions/34333685/calulcate-running-difference-of-time-using-difftime-on-one-column-of-timestamps

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!