【问题标题】:Converting R time column to specific strings将 R 时间列转换为特定字符串
【发布时间】:2023-03-15 13:25:02
【问题描述】:

我在 R 的数据框中有一列表示时间。

当我在列上调用 str() 函数时,它会说类似这样的内容

>str(df2$Time)
 Factor w/ 1441 levels "","00:01","00:02","00:03",..: 1086 1096 1111 and so on

问题是我想将此列转换为字符串类型,这样如果时间小于 12:00,它应该被修改为字符串 "moring" ,如果时间在 12:00 和 6:00 之间,它是“日光”等等。

我想到的第一步是将这个向量转换为数据帧列的时间类型,所以我使用了chron函数。

我输入了以下命令,

>df2$Time<-chron(times=df2$Time,format=c('h:m'))
 Error in convert.times(times., fmt) : format h:m may be incorrect
 In addition: Warning message:
In is.na(out$s) : is.na() applied to non-(list or vector) of type 'NULL"

所以我猜我应该在格式中添加第二个参数,所以我尝试了以下方法:

df2$Time<-chron(time=df2$Time,format=c('h:m:s'))

但还是出现同样的错误

我知道这只是第一步,可能是我的方法也错了。谁能建议我如何将这些时间数据单元格转换为早上、晚上、晚上等。

非常感谢任何帮助。

【问题讨论】:

  • df2$Time 是具有小时:分钟值的类型因子,例如 06:00。使用df2$Time &lt;- ifelse(as.numeric(sub("(\\d{1,2}):.*", "\\1", df2$Time)) &lt; 6, "night", "day") 将小时值night 交换,其他值与day 交换。
  • @lukeA 这是一个不错的解决方案,您应该将其添加为答案。

标签: r datetime


【解决方案1】:

使用 chron 的 "times" 类和 cut

library(chron)

# data in reproducible form
df2 <- data.frame(Times = c("00:01","12:02","19:03"))

df2$Times <- times(paste0(df2$Times, ":00")) # append a chron "times" class column
breaks <- c(0, 12, 18, 24) / 24 # times are internally fractions of a day
labels <- c("morning", "daylight", "evening")
df2$ind <- cut(df2$Times, breaks, labels, include.lowest = TRUE)

给出:

> df2
     Times      ind
1 00:01:00  morning
2 12:02:00 daylight
3 19:03:00  evening

下次请以可重复的形式提供您的数据。

修订小幅简化和修正错字。

【讨论】:

  • 对不起,我是新来的。可复制的形式究竟是什么意思?
  • 这意味着它是自包含的,并且是 R 可以直接读取而无需手动操作的形式。即应该可以将数据和代码从您的帖子复制到剪贴板,然后将其粘贴到 R 会话中以运行它。参见dput 命令和stackoverflow.com/questions/5963269/…
  • 错字。已修复。
【解决方案2】:

lubridate 相同(对不起,Joran,我喜欢这个包),函数hourhm

Time <- hour(hm("13:24","19:32","3:45","08:25", "21:45", "11:13", "00:00"))
your_breaks <- hour(hm("00:00", "6:00", "12:00", "18:00", "23:59"))
your_labels <- c("Night", "Morning", "Afternoon", "Evening")
cut(x=Time, breaks=your_breaks, labels=your_labels, include.lowest=TRUE)

[1] Afternoon Evening   Night     Morning   Evening   Morning   Night

【讨论】:

    【解决方案3】:

    首先是一些可重现的例子:

    time <- expand.grid(0:23,0:59)
    time <- apply(time,1,function(x)sprintf("%02i:%02i",x[1],x[2]))
    

    一种方法是在您的小时数据前面粘贴一些假日期,以便您可以将您的时间数据解析为 POSIXct,然后使用cut 对其进行排序:

    time <- strptime(paste("01/01/01",time),"%y/%m/%d %H:%M")
    
    cut(time,
        breaks= as.POSIXct(paste("2001-01-01",
                           c("00:00:00", "12:00:00", "18:00:00", "23:59:59"))),
        labels=c('morning','afternoon','night'))
    

    【讨论】:

    • 上面的命令会做什么?我的意思是它将如何分区?我想在晚上 8 点到早上 6 点之间分开,早上 6 点到早上 8 点,下午 5:30 到晚上 8:00 是黄昏,早上 8 点到下午 5:30 是白天。我应该在上面的命令中进行哪些修改。
    • 在参数breaks 中方便地给出了中断。所以你必须通过以下方式修改它:cut(time, breaks= as.POSIXct(paste("2001-01-01",c("00:00:00", "06:00:00", "08:00:00",17:30:00","20:00:00","23:59:59"))),labels=c('night','twilight','daylight','twilight','night'))
    • 我做到了,但收到警告:不推荐使用重复的因子级别
    • 如果您的 break 参数以“00:00:00”开始并以“00:00:00”结束,则会发生这种情况。这就是我使用“23:59:59”的原因。你不能重复一个断点。
    猜你喜欢
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多