【问题标题】:R package constructing time objects from date and hour(integer)R包从日期和小时(整数)构造时间对象
【发布时间】:2015-05-15 19:21:08
【问题描述】:

我以日期的形式提供了数据(格式“YYYY-MM-DD”,例如“2015-03-11”和编号为 (0-23) 的一天中的小时)。

生成表单时间对象最方便的方法是什么

"2015-03-11" and hour = 0 ->  "2015-03-11 00:00"
"2015-03-11" and hour = 1 ->  "2015-03-11 01:00"
"2015-03-11" and hour = 2 ->  "2015-03-11 02:00"

我可以使用 Base 的 Date 函数或 xts 或 timeDate 的函数。 应该很容易,但我相信有人很快就知道了。

编辑:数据分两列提供,一列用于日期,一列用于数字。

【问题讨论】:

  • 您是否有类似"2015-03-11" and hour = 0" 的字符串,或者它是两列带有date 并且数值在另一列中形成0-23 的字符串?
  • 2 列 - 一个日期和一个数字。
  • 它按照您建议的方式工作,我添加了一个时区,因为数据来自不同的时区。数据是UTC,我是CET as.POSIXct(sprintf('%s %02d', '2015-03-11', 2), format='%Y-%m-%d %H',tz = "UTC ”)。谢谢!
  • 当你说“时间对象”作为输出时,你想要一个 POSIXct 还是一个字符串?
  • 没关系 - 当我拥有可以转换的字符串时。谢谢!

标签: r datetime posixct date-conversion


【解决方案1】:

您不需要外部包来执行此操作。
如果您的数据采用这种格式:

df=data.frame(date=c("2015-03-11","2015-03-11","2015-03-11"),hour=0:2)

只需应用以下函数:

format(as.POSIXct(df$date)+df$hour*60*60, format = "%Y-%m-%d %H:%M")

【讨论】:

    【解决方案2】:

    假设我们有这个输入:

    date <- c("2015-03-11", "2015-03-12")
    hour <- 2:3
    

    然后尝试以下方法之一:

    1) 计时

    library(chron)
    as.chron(date) + hour/24
    

    给予:

    [1] (03/11/15 02:00:00) (03/12/15 03:00:00)
    

    2) POSIXct。这个只使用R的基础,没有包:

    as.POSIXct(date) + 3600 * hour    
    

    在我的系统上给予:

    [1] "2015-03-11 02:00:00 EDT" "2015-03-12 03:00:00 EDT"
    

    如果您想要 UTC 时区的结果,请使用:

    as.POSIXct(date, tz = "UTC") + 3600 * hour  
    

    3) 润滑

    library(lubridate)
    ymd(date) + hours(hour)
    

    给予:

    [1] "2015-03-11 02:00:00 UTC" "2015-03-12 03:00:00 UTC"
    

    如果你希望它在当前时区,那么:

    ymd(date, tz = "") + hours(hour)
    

    请注意,chron 解决方案提供了一个不使用时区的日期/时间类,从而消除了时区可能导致的许多问题。 POSIXct 和 lubridate 解决方案给出了特定时区的日期/时间,如图所示。

    【讨论】:

      【解决方案3】:

      你可以试试

      dtime <- with(df, as.POSIXct(sprintf('%s %02d', date, hour),
                          format = "%Y-%m-%d %H")) 
      

      然后像在其他帖子中一样使用format

      或者

       library(lubridate)
       ymd_h(with(df, sprintf('%s %02d', date, hour)))
      

      或者稍微紧凑一些

      ymd_h(do.call(paste, df))
      

      【讨论】:

      • @DavidArenburg 为此,我必须窃取你的do.call :-)
      【解决方案4】:

      试试这个。如果您愿意,您可以在之后使用format 对其进行格式化,但我认为最好将其保留在POSIXct 类中,这样您就可以在后面操作它(添加删除天数、秒数等)

      as.POSIXct(do.call(paste, df), format = "%Y-%m-%d %H")
      ## [1] "2015-03-11 00:00:00 IST" "2015-03-11 01:00:00 IST" "2015-03-11 02:00:00 IST"
      

      不过,如果你坚持你的确切输出,这里是 format 的解决方案

      format(as.POSIXct(do.call(paste, df), format = "%Y-%m-%d %H"), "%Y-%m-%d %H:%M")
      ## [1] "2015-03-11 00:00" "2015-03-11 01:00" "2015-03-11 02:00"
      

      数据

      df <- structure(list(V1 = structure(c(1L, 1L, 1L), .Label = "2015-03-11", class = "factor"), 
          V2 = 0:2), .Names = c("V1", "V2"), class = "data.frame", row.names = c(NA, 
      -3L))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-04
        • 1970-01-01
        • 2012-12-23
        • 1970-01-01
        • 1970-01-01
        • 2020-02-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多