【问题标题】:Split column of format YYYY-MM-DD HH:MM:SS to two (date object) columns YYYY-MM-DD and HH:MM:SS in R将格式 YYYY-MM-DD HH:MM:SS 的列拆分为 R 中的两个(日期对象)列 YYYY-MM-DD 和 HH:MM:SS
【发布时间】:2013-05-10 18:30:58
【问题描述】:

我需要以 2012-09-27 07:05:59 的形式将时间和日期从具有 time 列的 data.frame 中分离出来。 然后我必须使用datetime 列来提取特定日期/时间的数据。 我该怎么做呢?可能是我想做this one的相反操作。

我尝试使用strptime 函数和lubridate 包,但无法使其工作。

data1 <- structure(list(event.date = structure(list(sec = c(59, 29, 59, 
0, 29, 59, 29, 29, 59, 59), min = c(5L, 7L, 15L, 17L, 17L, 19L, 
21L, 22L, 22L, 23L), hour = c(7L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 
7L, 7L), mday = c(27L, 27L, 27L, 27L, 27L, 27L, 27L, 27L, 27L, 
27L), mon = c(8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L), year = c(112L, 
112L, 112L, 112L, 112L, 112L, 112L, 112L, 112L, 112L), wday = c(4L, 
4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L), yday = c(270L, 270L, 270L, 
270L, 270L, 270L, 270L, 270L, 270L, 270L), isdst = c(0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("sec", "min", "hour", 
"mday", "mon", "year", "wday", "yday", "isdst"), class = c("POSIXlt", 
"POSIXt"), tzone = c("CST", "GMT", "   ")), VE = c(45L, 55L, 
45L, 50L, 55L, 35L, 30L, 45L, 55L, 30L)), .Names = c("event.date", 
"VE"), row.names = c(NA, 10L), class = "data.frame")

下面给我NAs:

as.Date(as.character(data1$event.date),"%HH:%MM:%SS")

我也无法成功使用lubridate...

ymd_hms(as.character(data1$event.date))

我对应该使用哪种日期格式/包感到困惑。

【问题讨论】:

  • 查看?strptime 以了解如何构造format 参数。你需要"%Y-%m-%d %H:%M:%S"。您还有其他问题吗?
  • 我使用strptime将变量从因子转换为POSIXlt
  • 这些数据最初是否来自文本文件?如果是这样,这些文件的格式是什么?另外,您要准确提取什么日期/时间?
  • 它们来自一个数据库,其中event$date 列是Factor,其值类似于9/27/2012 07:05:59。我想分隔时间和日期
  • 为什么要分离时间和日期?你到底想用它们做什么?

标签: r date datetime lubridate


【解决方案1】:

给你:

R> data1$pt <- as.POSIXct(data1[,1])              # parse time from ISO string
R> data1$date <- as.Date(data1[,"pt"])            # transform to Date
R> data1$time <- format(data1[,"pt"], "%H:%M:%S") # transform to time string
R> data1
            event.date VE                  pt       date     time
1  2012-09-27 07:05:59 45 2012-09-27 07:05:59 2012-09-27 07:05:59
2  2012-09-27 07:07:29 55 2012-09-27 07:07:29 2012-09-27 07:07:29
3  2012-09-27 07:15:59 45 2012-09-27 07:15:59 2012-09-27 07:15:59
4  2012-09-27 07:17:00 50 2012-09-27 07:17:00 2012-09-27 07:17:00
5  2012-09-27 07:17:29 55 2012-09-27 07:17:29 2012-09-27 07:17:29
6  2012-09-27 07:19:59 35 2012-09-27 07:19:59 2012-09-27 07:19:59
7  2012-09-27 07:21:29 30 2012-09-27 07:21:29 2012-09-27 07:21:29
8  2012-09-27 07:22:29 45 2012-09-27 07:22:29 2012-09-27 07:22:29
9  2012-09-27 07:22:59 55 2012-09-27 07:22:59 2012-09-27 07:22:59
10 2012-09-27 07:23:59 30 2012-09-27 07:23:59 2012-09-27 07:23:59
R> 

这是你的列类型,显示我使用第一个命令将POSIXlt 更改为POSIXct

R> sapply(data1, class)
$event.date
[1] "POSIXlt" "POSIXt" 

$VE
[1] "integer"

$pt
[1] "POSIXct" "POSIXt" 

$date
[1] "Date"

$time
[1] "character"

R> 

【讨论】:

    【解决方案2】:

    我从 cmets 的理解是,你得到的数据实际上看起来像 data2。使用该原始数据,我们可以获得具有"POSIXct" 类日期时间列、"Date" 类日期列和"character" 类时间列的 data3:

    data2 <- transform(data1, 
        event.date = factor(format(event.date, "%m/%d/%Y %H:%M:%S")))
    
    data3 <- transform(data2, 
        event.date = as.POSIXct(event.date, format = "%m/%d/%Y %H:%M:%S"), 
        date = as.Date(event.date, format = "%m/%d/%Y"),
        time = sub(".* ", "", event.date),
            stringsAsFactors = FALSE)
    

    或者,如果我们希望它们都作为角色,那么我们可以这样做:

    data3a <- transform(data2, 
        event.date = as.character(as.POSIXct(event.date, format = "%m/%d/%Y %H:%M:%S")), 
        date = as.character(as.Date(event.date, format = "%m/%d/%Y")),
        time = sub(".* ", "", event.date),
            stringsAsFactors = FALSE)
    

    【讨论】:

      猜你喜欢
      • 2015-11-03
      • 1970-01-01
      • 2020-03-07
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-01
      • 2016-11-06
      相关资源
      最近更新 更多