【问题标题】:R - converting date and time fields to POSIXct with HHMMSS formatR - 使用 HHMMSS 格式将日期和时间字段转换为 POSIXct
【发布时间】:2013-04-24 10:49:08
【问题描述】:

我有一个包含三列的数据文件:

20010101 000000  0.833
20010101 000500  0.814
20010101 001000  0.794
20010101 001500  0.772
...

人眼很清楚,前两个是日期和时间。我需要将它们转换为 POSIXct(或者其他更好的方法,但我过去在 R 中处理时间戳的有限经验是使用 POSIXct)。通常,在使用 read.table 将其拉入后,我会使用:

df$DateTime <- as.POSIXct(paste(df$Date, df$Time), format="%Y%m%d %H%M%S")

但是,第二列似乎丢失了前导零(可能是通过类型强制?),因此它无法正常工作。

我查看了Combine date as integer and time as factor to POSIXct in RConverting two columns of date and time data to one,但两者都使用带分隔符的时间,例如:,因此没有相同的问题。

请问如何将这些列转换为 POSIXct?

【问题讨论】:

    标签: r datetime posixct


    【解决方案1】:

    你们很亲密。以下“简单”强制将前两列作为字符串读取,从而保存前导零。

    R> df <- read.table(text="20010101 000000  0.833
    20010101 000500  0.814
    20010101 001000  0.794
    20010101 001500  0.772", 
    + header=FALSE, colClasses=c("character", "character", "numeric"), 
    + col.names=c("Date", "Time", "Val"))
    R> df
          Date   Time   Val
    1 20010101 000000 0.833
    2 20010101 000500 0.814
    3 20010101 001000 0.794
    4 20010101 001500 0.772
    

    现在你正在尝试“正常工作”:

    R> df$DateTime <- as.POSIXct(paste(df$Date, df$Time), format="%Y%m%d %H%M%S")
    R> df
          Date   Time   Val            DateTime
    1 20010101 000000 0.833 2001-01-01 00:00:00
    2 20010101 000500 0.814 2001-01-01 00:05:00
    3 20010101 001000 0.794 2001-01-01 00:10:00
    4 20010101 001500 0.772 2001-01-01 00:15:00
    R> 
    

    【讨论】:

    • 我正在做这里描述的所有事情,POSIXct 返回 NA
    • 您可能有一个因子变量。试试anytime::anytime(paste(df$Date, df$Time)),因为它会为你转换一个因子变量。
    • 感谢您的回复,我有一些像600 这样的早期时间,他们所需要的只是前面的0
    • 所以你输入的格式不符合要求。晚上11点的新闻?很高兴你有它的工作。
    【解决方案2】:

    您只需要将数据作为字符导入:

    txt <- "Date  Time  value
    20010101 000000  0.833
    20010101 000500  0.814
    20010101 001000  0.794
    20010101 001500  0.772
    "
    
    df <- read.table(text=txt, header=TRUE, 
                     colClasses=c("character", "character", "numeric"))
    
    df$DateTime <- as.POSIXct(paste(df$Date, df$Time), format="%Y%m%d %H%M%S")
    

    【讨论】:

    • 谢谢。我接受了最先出现的答案,但这基本上是一样的:-)
    【解决方案3】:

    您只需使用 lubridate 包,它超级棒而且速度很快。为了你的目的,试试这个:

    df <- read.table(text="20010101 000000  0.833
    20010101 000500  0.814
    20010101 001000  0.794
    20010101 001500  0.772", 
                      header=FALSE, colClasses=c("character", "character",     "numeric"), 
                      col.names=c("Date", "Time", "Val"))
    
    df$mix <- paste(df$Date, df$Time)
    df$mix <- parse_date_time(df$mix, 'Ymd HMS')
    

    只需要输入正确的格式即可。比起as.POSICct,我更喜欢它,因为它更灵活,而且你还有其他函数可以处理时间变量。

    【讨论】:

      猜你喜欢
      • 2014-08-21
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      相关资源
      最近更新 更多