【问题标题】:extracting hour minute from non-delimited data从非分隔数据中提取小时分钟
【发布时间】:2016-01-08 00:51:13
【问题描述】:

我的仪器数据包含非分隔格式的小时和分钟(例如,0, 30, 100, 130, ... 2300, 2300)。我想将该列转换为 R 中的 POSIX 对象(例如,看起来像 "2016-01-07 11:07:59 EST" 的东西),我的第一步是从该列中提取小时和分钟数据。 (我也有相应的儒略日期和年份列。)

我被绊倒了,因为小时和分钟没有分隔并且我无法使用strptime 函数。我已经使用 Google 和 SO(使用 SO 上的 Rdatatime 标记)进行了搜索,但一直无法找到解决方案。我可以在 SO 上找到的所有示例(例如,herehere)都有小时和分钟以 0:30 之类的东西分隔。

这是我的 MCVE:

hour <- c(0, 30, 100, 130, 1000, 1030, 2300, 2330)
year <- c(2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007)
day  <- c(2, 2, 2, 2, 2, 2, 2, 2)
strptime(hour, "%h%m")

那么,当我有非定界数据时,如何提取小时和分钟?

【问题讨论】:

  • 这很接近......但忽略了分钟。另外,不确定如何解释会议记录。是 100 - 1:00 还是 10:00? as.POSIXct(paste(year, day, hour, sep = ':'), format = '%Y:%d:%H')

标签: r datetime


【解决方案1】:

您可以使用 sprintf 将前导 0 添加到少于 4 位的小时:

strptime(sprintf("%04d", hour), "%H%M")

然后您可以将其转换为日期:

as.POSIXct(paste(year,day,sprintf("%04d", hour),sep="-"),format = '%Y-%j-%H%M')

【讨论】:

  • 感谢您向我展示sprintf 功能。那是关键! (在你删除之前我也看到了你的评论)。
【解决方案2】:

使用sprintf:

as.POSIXct(sprintf("%d %d %04d", year, day, hour), "%Y %j %H%M", tz = "GMT")
#[1] "2007-01-02 00:00:00 GMT" "2007-01-02 00:30:00 GMT" "2007-01-02 01:00:00 GMT" "2007-01-02 01:30:00 GMT" "2007-01-02 10:00:00 GMT"
#[6] "2007-01-02 10:30:00 GMT" "2007-01-02 23:00:00 GMT" "2007-01-02 23:30:00 GMT"

请注意,儒略日是用%j 指定的,而不是%d

【讨论】:

    【解决方案3】:

    一种可能的解决方案是用 'stringr' 中的 'str_pad' 用足够的 0 填充小时,然后使用 'strptime':

    tmp <- stringr::str_pad(hour,4,"left","0")
    strptime(tmp, "%H%M")
    

    【讨论】:

      【解决方案4】:

      试试这个:

      hour <- c(0, 30, 100, 130, 1000, 1030, 2300, 2330)
      year <- c(2007, 2007, 2007, 2007, 2007, 2007, 2007, 2007)
      day  <- c(2, 2, 2, 2, 2, 2, 2, 2)
      
      mins <- substr(sprintf('%04d', hour), 3, 4)
      hour <- substr(sprintf('%04d', hour), 1, 2)
      
      as.POSIXct(paste(year, day, hour, mins, sep = ':'), format = '%Y:%d:%H:%M')
      
      [1] "2007-01-02 00:00:00 EST" "2007-01-02 00:30:00 EST"
      [3] "2007-01-02 01:00:00 EST" "2007-01-02 01:30:00 EST"
      [5] "2007-01-02 10:00:00 EST" "2007-01-02 10:30:00 EST"
      [7] "2007-01-02 23:00:00 EST" "2007-01-02 23:30:00 EST"
      

      【讨论】:

        猜你喜欢
        • 2017-12-17
        • 2023-03-21
        • 1970-01-01
        • 2019-05-18
        • 1970-01-01
        • 2019-05-27
        • 1970-01-01
        • 2018-09-15
        • 1970-01-01
        相关资源
        最近更新 更多