【问题标题】:Converting time data frame to numeric data [duplicate]将时间数据帧转换为数字数据[重复]
【发布时间】:2017-08-19 11:04:32
【问题描述】:

我有一个时间格式的数据框。我需要将其更改为数字数据。 我使用了以下格式,但我不确定它是否正确,因为值会以数字格式更改。

Photoperiod
08:52:41
08:53:35
08:54:33
08:55:36
08:56:44
08:57:55
08:59:11
09:00:31
09:01:55
09:03:23
09:04:55
09:06:31
09:08:10
09:09:53
09:11:40

DF<- read.csv2(file="DF.csv")
DF.a <-as.POSIXct(DF, format = "%H:%M:%S")

library(data.table)

DF.B<- lapply(DF.a , function(x) as.numeric(as.ITime(x)) / 3600)

【问题讨论】:

  • 问题出在哪里?前两次相差约 1 分钟。这是 1/60 ~0.016。如果您查看前两次之间的差异,则为 0.015。
  • 您期望看到什么值?函数as.numeric(as.ITime(x))/3600 会根据小时数(最多24)给出时间。例如,您可以检查 as.numeric(as.ITime("12:00:00"))/3600 返回 12,as.numeric(as.ITime("23:59:59"))/3600 返回 23.99972,等等。
  • 我的数据框是日光数据,所以 14:25:30 表示 14 小时 25 分钟的日光,我不知道我是否使用 as.numeric(as.ITime(x))/3600我是否粉碎了我的数据。只是感到困惑。

标签: r dataframe time numeric


【解决方案1】:

昨天在SO in portuguese 中提出了一个(非常)类似的问题。 Marcus Nunes 的答案可能会给你想要的。

请注意,他调用函数 HoraDecimal,葡萄牙语中的“DecimalHour”。

HoraDecimal <- function(x){
  sum(unlist(lapply(strsplit(x, split=":"), as.numeric)) * c(1, 1/60, 1/3600))
}

x <-  "02:20:00"
HoraDecimal(x)
[1] 2.333333

y <-  "00:50:00"
HoraDecimal(y)
[1] 0.8333333

z <- "3:30:30"
HoraDecimal(z)
[1] 3.508333

我在 cmets 部分提出了一个建议,使用 sapply 而不是 unlist(lapply(...))。下面就是这样一个版本。名字改成英文了。

DecimalHour <- function(x){
  sum(sapply(strsplit(x, split=":"), as.numeric) * c(1, 1/60, 1/3600))
}

DecimalHour(x)
DecimalHour(y)
DecimalHour(z)

转换方法是一样的,仍然是马库斯的功能,如果你觉得有用,功劳应该归他所有。

【讨论】:

  • 不会在%*% 在这里工作
  • @akrun 矩阵乘法返回matrix。我不相信这就是 OP 想要的。
猜你喜欢
  • 2021-11-16
  • 2019-01-16
  • 1970-01-01
  • 2021-04-05
  • 2017-04-09
  • 2018-07-14
  • 2018-08-19
  • 1970-01-01
相关资源
最近更新 更多