我想用我的简单程序做的是计算两个日期之间的秒差.
time_t referenceDate;
time_t dateNow = time(0);
struct tm referenceDateComponent = {0};
referenceDateComponent.tm_hour = 0;
referenceDateComponent.tm_min = 0;
referenceDateComponent.tm_sec = 0;
referenceDateComponent.tm_year = 89;
referenceDateComponent.tm_mon = 11;
referenceDateComponent.tm_mday = 31;
referenceDate = mktime(&referenceDateComponent);
long seconds = difftime(dateNow, referenceDate);
Run Code Online (Sandbox Code Playgroud)
Whit应用程序上面的代码工作正常,但如果尝试设置tm.year负数(在1900年之前构建日期)mktime()函数返回-1
我知道该time_t类型只管理从1970年1月1日UTC开始的日期,根据文档:
由于历史原因,它通常被实现为表示自UTC时间1970年1月1日00:00(即,unix时间戳)以来经过的秒数的整数值.尽管库可以使用替代时间表示来实现此类型.
我知道还有Boost库,但对我来说不是一个有用的解决方案.
所以我的问题是,从1970年以前的日期开始,有什么办法可以在几秒钟内获得变化?
我在 difftime 值的 data.table 中有一个列,单位设置为天。我正在尝试创建另一个 data.table 总结值
dt2 <- dt[, .(AvgTime = mean(DiffTime)), by = Group]
Run Code Online (Sandbox Code Playgroud)
打印新的 data.table 时,我看到诸如
1.925988e+00 days
1.143287e+00 days
1.453975e+01 days
Run Code Online (Sandbox Code Playgroud)
我只想限制此列的小数位值(即不设置,options()除非我可以通过这种方式专门针对 difftime 值执行此操作)。当我尝试使用上述方法执行此操作时,已修改,例如
dt2 <- dt[, .(AvgTime = round(mean(DiffTime)), 2), by = Group]
Run Code Online (Sandbox Code Playgroud)
我只剩下 NA 值,基数round()和format()函数都返回警告:
在 mean(DiffTime) 中:参数不是数字或逻辑。
奇怪的是,如果我对数字字段执行相同的操作,则运行没有问题。另外,如果我运行两行单独的代码,我可以完成我想要做的事情:
dt2 <- dt[, .(AvgTime = mean(DiffTime)), by = Group]
dt2[, AvgTime := round(AvgTime, 2)]
Run Code Online (Sandbox Code Playgroud)
library(data.table)
set.seed(1)
dt <- data.table(
Date1 =
sample(seq(as.Date('2017/10/01'),
as.Date('2017/10/31'),
by="days"), 24, replace = …Run Code Online (Sandbox Code Playgroud) 我有一个3个变量的数据框:POSIXct对象 - time,数字 - RRR和因子 - he.RRR液体降水量和he水文事件数在哪里,这里的时间对应于洪水事件的开始.
df <- structure(list(time = structure(c(1396879200, 1396922400, 1396976400,
1397008800, 1397095200, 1397332800, 1397354400, 1397397600, 1397451600,
1397484000, 1397527200, 1397786400, 1397959200, 1398002400, 1398024000,
1398132000, 1398175200, 1398218400, 1398261600, 1398369600, 1398466800,
1398477600, 1398520800, 1398564000, 1398607200, 1398747600, 1398780000,
1398909600, 1398952800, 1398974400, 1398996000),
class = c("POSIXct", "POSIXt"),
tzone = ""),
RRR = c(NA, 2, NA, 4, NA, NA, 0.9, 3,
NA, 0.4, 11, NA, 0.5, 1, NA, 13, 4, 0.8, 0.3, NA, NA, 8, …Run Code Online (Sandbox Code Playgroud) I'm currently running a for loop code and at the end of each loop I am measuring the duration of the loop and print a message that tells the user how long did the loop take.
To get the duration I'm using
duration <- difftime(end_time, start_time)
Run Code Online (Sandbox Code Playgroud)
And this is how I print the statement
print(paste("Loop", i, "took", duration, "to run.")).
Run Code Online (Sandbox Code Playgroud)
The problem is the duration of each loop may range from 30 seconds to 1 hour. Putting the duration inside …
我有两个约会:
date1 <- '2015-10-05T20:57:00.000'
date2 <- '2015-10-05T22:43:00.000'
Run Code Online (Sandbox Code Playgroud)
1)我需要知道分钟的差异2)我还要提取年,月,日和小时.
这就是我尝试解决这些任务的方法:
1)time <- difftime(date1,date2,units="mins") #结果为0而不是106.
2)我想要"lubridate",但不知道如何将它应用于我的格式.
I think this is quite a simple question, I am however incapable of solving it, so any help would be greatly appreciated.
I have a difftime object, generated as follows:
> duration <- difftime(end_time, start_time)
> duration
Time difference of 15.74106 secs
Run Code Online (Sandbox Code Playgroud)
The end_time and start_time objects are POSIXct objects and look like this:
> c(start_time, end_time)
[1] "2018-07-08 20:07:56 EDT" "2018-07-08 20:08:12 EDT"
Run Code Online (Sandbox Code Playgroud)
I need duration to be displayed in HH:MM:SS format - i.e. like this, in a string: …
我有不同工作的"开始"和"结束"时间数据,按"所有者"分组:
Data <- data.frame(
job = c(1, 2, 3, 4, 5),
owner = c("name1", "name2", "name1", "name1", "name2"),
Start = as.POSIXct(c("2015-01-01 15:00:00", "2015-01-01 15:01:00", "2015-01-01 15:13:00", "2015-01-01 15:20:00", "2015-01-01 15:39:02"), format="%Y-%m-%d %H:%M:%S"),
End = as.POSIXct(c("2015-01-01 15:11:11", "2015-01-01 15:17:21", "2015-01-01 15:17:00", "2015-01-01 15:31:21", "2015-01-01 15:40:11"), format="%Y-%m-%d %H:%M:%S")
)
Run Code Online (Sandbox Code Playgroud)
对于每个所有者,我想计算每个所有者的作业之间的空闲时间,即一个作业的"结束"时间与下一个作业的"开始"时间之间的差异.
如何使用difftime()不同列中的特定行和时间之间的时间差来计算?
结果应如下所示:
job, owner, idletime
1, name1, NA
2, name2, NA
3, name1, 1.816667 # End of row 1 minus Start of row 3
4, name1, 3.0 # End of …Run Code Online (Sandbox Code Playgroud) 我有一个来自xts对象的不规则时间索引.我需要找到两次观察之间的平均秒数.这是我的样本数据:
dput(tt)
structure(c(1371.25, NA, 1373.95, NA, NA, 1373, NA, 1373.95,
1373.9, NA, NA, 1374, 1374.15, NA, 1374, 1373.85, 1372.55, 1374.05,
1374.15, 1374.75, NA, NA, 1375.9, 1374.05, NA, NA, NA, NA, NA,
NA, NA, 1375, NA, NA, NA, NA, NA, 1376.35, NA, NA, NA, NA, NA,
NA, NA, NA, NA, NA, 1376.25, NA, 1378, 1376.5, NA, NA, NA, 1378,
1378, NA, NA, 1378.8, 231.9, 231.85, NA, 231.9, 231.85, 231.9,
231.8, 231.9, 232.6, 231.95, 232.35, 232, 232.1, 232.05, …Run Code Online (Sandbox Code Playgroud) 我希望根据开始工作时间和结束工作时间计算不同组的时间差异。我如何告诉 R 根据组中的标签计算两行之间的差异时间?下面是一个示例数据集:
library(data.table)
latemail <- function(N, st="2012/01/01", et="2012/02/01") {
st <- as.POSIXct(as.Date(st))
et <- as.POSIXct(as.Date(et))
dt <- as.numeric(difftime(et,st,unit="sec"))
ev <- sort(runif(N, 0, dt))
rt <- st + ev
}
#create our data frame
set.seed(42)
dt = latemail(20)
work = setDT(as.data.frame(dt))
work[,worker:= stringi::stri_rand_strings(2, 5)]
work[,dt:= as.POSIXct(as.character(work$dt), tz = "GMT")]
work[,status:=NA]
#order
setorder(work, worker, dt)
#add work times
work$status[1] = "start"
work$status[5] = "end"
work$status[6] = "start"
work$status[10] = "end"
work$status[11] = "start"
work$status[15] = "end"
work$status[16] = "start"
work$status[20] = …Run Code Online (Sandbox Code Playgroud) 我想用 ggplot2 显示 difftime 数据,并且我希望刻度格式为hh:mm.
library(ggplot2)
a= as.difftime(c("0:01", "4:00"), "%H:%M", unit="mins")
b= as.difftime(c('0:01', "2:47"), "%H:%M", unit="mins")
ggplot(data=NULL, aes(x=b, y=a)) + geom_point(shape=1) +
scale_x_time(labels = date_format("%H:%M"),
breaks = "1 hour")
Run Code Online (Sandbox Code Playgroud)
但我收到以下警告:
Don't know how to automatically pick scale for object of type difftime. Defaulting to continuous.
Warning message:
In structure(as.numeric(x), names = names(x)) : NAs introduced by coercion
Run Code Online (Sandbox Code Playgroud)
更新: 我的例子太小了,我还需要能够显示负差异,所以这将是更好的数据:
a= as.difftime(c(-60, -4*60), unit="mins")
b= as.difftime(c(-60, 2*60+47), unit="mins")
ggplot(data=NULL, aes(x=b, y=a)) + geom_point(shape=1)
Run Code Online (Sandbox Code Playgroud) 我想计算两个日期之间的秒数差异,但结果是0.
这是代码:
time_t=time(NULL);
struct tm * timeNow=localtime();
time_t start=mktime(&*timeNow);
time_t end=mktime(&*recordFind->timeInserted);
double seconds=difftime(start,end);
Run Code Online (Sandbox Code Playgroud)
recordFind->timeInserted 是的,因为我打印他的成员并且没问题,但是当我打印秒数是0.000000;
如何计算两个连续时间戳行的时间差(以分钟为单位),并将结果添加到新列中.
我试过这个:
data$hours <- as.numeric(floor(difftime(timestamps(data), (timestamps(data)[1]), units="mins")))
Run Code Online (Sandbox Code Playgroud)
但只能从零时间开始获得差异.
添加了我想要添加的'mins'列的示例数据
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
Run Code Online (Sandbox Code Playgroud) 我有以下两个数据框:
Date <- seq(as.Date("2013/1/1"), by = "day", length.out = 17)
x <-data.frame(Date)
x$discharge <- c("1000","1100","1200","1300","1400","1200","1300","1300","1200","1100","1200","1200","1100","1400","1200","1100","1400")
x$discharge <- as.numeric(x$discharge)
Run Code Online (Sandbox Code Playgroud)
和
Date2 <- c("2013-01-01","2013-01-08","2013-01-12","2013-01-17")
y <- data.frame(Date2)
y$concentration <- c("1.5","2.5","1.5","3.5")
y$Date2 <- as.Date(y$Date2)
y$concentration <- as.numeric(y$concentration)
Run Code Online (Sandbox Code Playgroud)
我试图用以下代码计算从一个日期到另一个日期的天数:
y %>%
mutate(BETWEEN0=as.numeric(difftime(Date2,lag(Date2,1))),BETWEEN=ifelse(is.na(BETWEEN0),0,BETWEEN0))%>%
select(-BETWEEN0)
Run Code Online (Sandbox Code Playgroud)
导致:
Date2 concentration BETWEEN
1 2013-01-01 1.5 0
2 2013-01-08 2.5 7
3 2013-01-12 1.5 4
4 2013-01-17 3.5 5
Run Code Online (Sandbox Code Playgroud)
但是,我需要的是在第一个日期等旁边打印的两个日期之间计算的天数,例如
Date2 concentration BETWEEN
1 2013-01-01 1.5 7
2 2013-01-08 2.5 4
3 2013-01-12 1.5 5
4 2013-01-17 3.5 0
Run Code Online (Sandbox Code Playgroud)
这意味着从2013-01-01到2013-01-07是7天,从2013-01-08到2013-01-12是4天等.