如何从R表中的开始和结束时间列创建新的“时差”列

问题描述 投票:2回答:3

我收到了一份数据表供分析。我有一个包含开始时间的列和一个以3或4位数给出完成时间的列,例如:下午3:40是1540,上午7:25是725。

如何在表中获得一个新列,这些时间的差异以分钟为单位给出?有超过2000个条目。

谢谢你的帮助。

structure(list(schedtime = c(1455L, 1640L, 1245L, 1715L, 1039L, 
840L), deptime = c(1455L, 1640L, 1245L, 1709L, 1035L, 839L), 
distance = c(184L, 213L, 229L, 229L, 229L, 228L), flightnumber = 
c(5935L, 
6155L, 7208L, 7215L, 7792L, 7800L), weather = c(0L, 0L, 0L, 
0L, 0L, 0L), dayweek = c(4L, 4L, 4L, 4L, 4L, 4L), daymonth = c(1L, 
1L, 1L, 1L, 1L, 1L)), row.names = c(NA, 6L), class = "data.frame")

这是数据集的一个例子(我不确定为什么在每个数字后面都有L's,这些没有在表中显示)。我想,在几分钟内,deptime(完成) - schedtime(开始)。

给定新列,有2个值在午夜之前有一个schedtime,在午夜之后有一个deptime,例如schedtime 2120和deptime 0010.答案是-1270,考虑到它是一个非常早的离开。我怎么能改变这个计算为+170,一个迟到的离开?

r time
3个回答
0
投票

更高数据集的有效方法 -

data.table::setDT(dt)[,time_diff:=minutes(deptime-schedtime)]

> dt
   schedtime deptime distance flightnumber weather dayweek daymonth time_diff
1:      1455    1455      184         5935       0       4        1        0S
2:      1640    1640      213         6155       0       4        1        0S
3:      1245    1245      229         7208       0       4        1        0S
4:      1715    1709      229         7215       0       4        1    -6M 0S
5:      1039    1035      229         7792       0       4        1    -4M 0S
6:       840     839      228         7800       0       4        1    -1M 0S

编辑 - (处理像1730 - 1600 = 130分钟的案件(实际上是90分钟)。

library(data.table)
library(stringr)
setDT(dt)
dt[,schedtime:=str_pad(schedtime, 4, pad = "0")]
dt[,deptime:=str_pad(deptime, 4, pad = "0")]

dt[,time_diff:=difftime(as.ITime(strptime(x = schedtime, format = "%H%M")),as.ITime(strptime(x = deptime, format = "%H%M")),units = "mins")]


> dt
   schedtime deptime distance flightnumber weather dayweek daymonth time_diff
1:      1455    1455      184         5935       0       4        1    0 mins
2:      1640    1640      213         6155       0       4        1    0 mins
3:      1245    1245      229         7208       0       4        1    0 mins
4:      1715    1709      229         7215       0       4        1    6 mins
5:      1039    1035      229         7792       0       4        1    4 mins
6:      1730    1600      228         7800       0       4        1   90 mins

0
投票
dat <- data.frame(c(1540,1820,1330,545,100),c(1850,2150,2325,1330,101))
60*(floor(dat[,2]/100) - floor(dat[,1]/100)) - dat[,1] %% 100 + dat[,2] %% 100

占据数百人的地板可以得到时间。取差值并乘以60得出小时差的分钟数。然后您可以减去原始分钟数并添加最后几分钟以获得总分钟数。


0
投票

您可以使用library lubridate来查找分钟的差异。希望这可以帮助。 lubridate为时间相关数据提供了非常好的功能。

library(lubridate)
df$deptime_new <- minutes(df$deptime-df$schedtime)

Data

df <- structure(list(schedtime = c(1455L, 1640L, 1245L, 1715L, 1039L, 
                                   840L), deptime = c(1455L, 1640L, 1245L, 1709L, 1035L, 839L), 
                     distance = c(184L, 213L, 229L, 229L, 229L, 228L), flightnumber = 
                       c(5935L, 
                         6155L, 7208L, 7215L, 7792L, 7800L), weather = c(0L, 0L, 0L, 
                                                                         0L, 0L, 0L), dayweek = c(4L, 4L, 4L, 4L, 4L, 4L), daymonth = c(1L, 
                                                                                                                                        1L, 1L, 1L, 1L, 1L)), row.names = c(NA, 6L), class = "data.frame")
© www.soinside.com 2019 - 2024. All rights reserved.