【问题标题】:R, time-variable as factor. How to find the value closest to a certain time?R,时变因子。如何找到最接近某个时间的值?
【发布时间】:2025-12-28 12:50:06
【问题描述】:

我在 Rstudio 工作,我有一个因子变量“时间”。因此,我看到的值的一个示例可能是“10:17:38”。目标:我想找出数据集中的哪个观测值最接近某个时间,比如“09:58:13”。如何在 Rstudio 中做到这一点?

我尝试将值“09:58:13”添加为单独的变量,例如“Fixed_time”(所有观察值相同)。然后的想法是通过说差异=时间固定_时间并找到“差异”的最小绝对值来创建一个新变量。问题是我从来没有设法获得一种允许我从另一个中减去一个的格式。我尝试过 as.POSIXct ,它还添加了今天的年、月和日,我不需要在我的变量中。能否请你帮忙?谢谢!

【问题讨论】:

  • 我不知道 R 但是,查看一小段代码可能会有所帮助,显示您如何加载非固定时间值,因此很明显它们实际上是什么数据类型存储为。从您的问题看来,它们可能是字符串?
  • 我想知道您是否可以尝试将时间值转换为difftime 类,然后运行一些代码来获取差异。如果你有一些练习数据,我可以对其进行一些讨论并编写出我所说的内容。
  • 最简单的方法是:dput(head(data))。然后,您只需将输出复制到帖子的编辑版本即可。

标签: r date time


【解决方案1】:

正如其他人已经提到的,示例数据集很重要。

在不知道您的数据的情况下,我建议添加日期本身以避免在更改日期(午夜)时出现问题。

您可以根据需要更改以下代码。请注意,某些代码行仅用于测试用例 - 看看会发生什么。

# --- Create some data ---
dat <- read.table(textConnection("date time observation
2019-11-01 15:01:32 100
2019-11-01 18:26:31 115
2019-11-01 10:17:38 51
2019-11-01 20:23:21 278"), header=TRUE) 
dat

# --- set certain time ---
CertainTime <- "2019-11-01 09:58:13"
SmallestValue <- 86400 # seconds of one day

for(i in 1:4) {
  ObservationTime <- paste(dat[i,1],dat[i,2])
  diff <- difftime(CertainTime, ObservationTime, units = "secs")
  print("-------------------")
  print(CertainTime)
  print(ObservationTime, max.levels=0)
  print(paste("Index", i, "time diff ", diff, "to certain time.")) 


  if(diff*(-1) < SmallestValue){
    SmallestValue <- diff*(-1) 
    print("smaller value found")
    print(SmallestValue)
    SmallestValueindex <- i
  }  
}

print(SmallestValueindex)
print(SmallestValue)

# print oberservation data
print (paste ("Date:", dat[SmallestValueindex,1], "Time:", dat[SmallestValueindex,2], "Observation:", dat[SmallestValueindex,3]))

最后一行代码的输出:

[1] "Date: 2019-11-01 Time: 10:17:38 Observation: 51"

【讨论】: