gpt4 book ai didi

r - 计算 %H 中的时间差 :%M:%S format in R

转载 作者:行者123 更新时间:2023-12-04 23:56:31 26 4
gpt4 key购买 nike

我正在尝试计算满足特定条件的行的 2 列之间的时间差。

dates1 <- c("1899-12-31 12:20:00 PMT", "1899-12-31 15:30:00 PMT", "1899-12-31 13:20:00 PMT", "1899-12-31 11:50:00 PMT",
NA)

dates2 <- c("1899-12-31 11:13:00 PMT", "1899-12-31 11:41:00 PMT", "1899-12-31 14:04:00 PMT", "1899-12-31 13:03:00 PMT",
"1899-12-31 13:18:00 PMT")

site <- c(15, 16, 18, 18,
15)

DS <- as.data.frame(cbind(site, dates1 , dates2))

## convert to POSIXct format
DS[, 2:3] <- lapply(DS[, 2:3], function(x) as.POSIXct(strptime(x,"%Y-%m-%d %H:%M:%S ",tz="")))

## create a new columns with the time difference between dates1 and dates2 in %H:%M:%S format if site=18 , else take value from column dates1
DS$output <- ifelse(DS$site ==18,
difftime(DS$dates1, DS$dates2, units = "mins"),
DS$dates1)

## using the code above doesnt work because:
#1- using the difftime function I can't choose the "%H:%M:%S" for the output
#2- for sites != 18, the dates1 lose its "%H:%M:%S format


# I have also tried to use:
DS$output <- ifelse(DS$site ==18,
difftime(DS$dates1, DS$dates2, units = "mins"),
0)
## and then convert the difference in minutes to %H:%M:%S format using
DS$output<- as.difftime(DS$output , format = "%H:%M:%S", units = "mins")

## but it doesnt work.

## the output should be something like:

output<- c("12:20:00", "15:30:00","00:44:00", "01:13:00", NA)

DS.out <- cbind(DS, output)

> DS.out
site dates1 dates2 output
1 15 1899-12-31 12:20:00 PMT 1899-12-31 11:13:00 PMT 12:20:00
2 16 1899-12-31 15:30:00 PMT 1899-12-31 11:41:00 PMT 15:30:00
3 18 1899-12-31 13:20:00 PMT 1899-12-31 14:04:00 PMT 00:44:00
4 18 1899-12-31 11:50:00 PMT 1899-12-31 13:03:00 PMT 01:13:00
5 15 <NA> 1899-12-31 13:18:00 PMT <NA>

#Where output is the time difference calculated for rows 3 and 4 (site=18)
#or a copy of the time from dates 1 for the other rows (with sites different from 18).

无论如何,是否可以使用不同的函数以 H%:%M:%S 格式计算时差?

最佳答案

您可以使用 chron 库中的“时间”格式。

(这不是很简单,但似乎有效)

# get the difference in minutes
DS$Time1NEW <- ifelse(DS$site ==18,
difftime(DS$dates1, DS$dates2, units = "mins"),
NA)

# get the absolute value
DS$Time1NEW<-abs(DS$Time1NEW)

# conver to hours:min:sec using "times" from library chron
DS$hours_minutes<-times((DS$Time1NEW%/%60 + DS$Time1NEW%%60 /60)/24)

# convert the others (not in site 18)
DS$no18<-times(paste0(hours(DS$dates1),':', minutes(DS$dates1),':', seconds(DS$dates1)))

# create final data column
DS$final<-DS$hours_minutes

# now substitute when necessary
wh<-which(is.na(DS$final))
DS$final[wh]<-DS$no18[wh]

这就是你得到的:
> head(DS)
site dates1 dates2 Time1NEW hours_minutes no18 final
1 15 1899-12-31 12:20:00 PMT 1899-12-31 11:13:00 PMT NA <NA> 12:20:00 12:20:00
2 16 1899-12-31 15:30:00 PMT 1899-12-31 11:41:00 PMT NA <NA> 15:30:00 15:30:00
3 18 1899-12-31 13:20:00 PMT 1899-12-31 14:04:00 PMT 44 00:44:00 13:20:00 00:44:00
4 18 1899-12-31 11:50:00 PMT 1899-12-31 13:03:00 PMT 73 01:13:00 11:50:00 01:13:00
5 15 <NA> 1899-12-31 13:18:00 PMT NA <NA> <NA> <NA>

关于r - 计算 %H 中的时间差 :%M:%S format in R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61102608/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com