如何从R表中的开始和结束时间列创建新的“时差”列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从R表中的开始和结束时间列创建新的“时差”列相关的知识,希望对你有一定的参考价值。
我收到了一份数据表供分析。我有一个包含开始时间的列和一个以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,一个迟到的离开?
答案
更高数据集的有效方法 -
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
另一答案
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得出小时差的分钟数。然后您可以减去原始分钟数并添加最后几分钟以获得总分钟数。
另一答案
您可以使用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")
以上是关于如何从R表中的开始和结束时间列创建新的“时差”列的主要内容,如果未能解决你的问题,请参考以下文章