【问题标题】:R: Lubridate Failing to Convert Character to NumericR:Lubridate 无法将字符转换为数字
【发布时间】:2022-01-10 18:17:48
【问题描述】:

我是 R 新手 - 并在旧帖子中搜索了答案,但没有找到任何解决我问题的方法。

我以 mdy h:mm:ss 格式提取了旅行开始时间的 csv,但它目前被识别为一个字符。我试过使用mdy_hms(c("11/1/2020 0:05:00","11/1/2020 7:29:00","11/1/2020 14:04:00"))as.Date(parse_date_time(dc_biketrips$started_at, c(mdy_hms))) 无济于事。

有人对我如何解决这个问题有任何建议吗?

更新:我也尝试使用date <-mdy_hms(c("11/1/2020 0:05:00","11/1/2020 7:29:00","11/1/2020 14:04:00")) str(date)但这也没有用

attempt to use date <-mdy_hms(C("11/1/2020 0:05:00"etc

image of csv

【问题讨论】:

    标签: r date character lubridate


    【解决方案1】:

    一种选择是使用as.POSIXct

    started_at <- c("11/1/2020 0:05:00","11/1/2020 7:29:00","11/1/2020 14:04:00")
    
    as.POSIXct(started_at, format = "%m/%d/%Y %H:%M:%OS")
    #> [1] "2020-11-01 00:05:00 CET" "2020-11-01 07:29:00 CET"
    #> [3] "2020-11-01 14:04:00 CET"
    

    编辑

    library(lubridate)
    library(dplyr)
    
    started_at <- c("11/1/2020 0:05:00","11/1/2020 7:29:00","11/1/2020 14:04:00")
    
    1. as.POSIXctlubridate::mdy_hms 都返回 "POSIXct" "POSIXt" 类的对象
    class(as.POSIXct(started_at, format = "%m/%d/%Y %H:%M:%OS"))
    #> [1] "POSIXct" "POSIXt"
    class(mdy_hms(started_at))
    #> [1] "POSIXct" "POSIXt"
    
    1. 不确定您的期望。当我运行您的代码时,一切正常,除了在过滤 week &lt; 15 后我们最终得到 0 obs,因为示例数据中的所有日期都来自第 44 周:
    dc_biketrips <- data.frame(
      started_at
    )
    
    dc_biketrips <- dc_biketrips %>% 
      mutate(started_at = as.POSIXct(started_at, format = "%m/%d/%Y %H:%M:%OS"),
             interval60 = floor_date(started_at, unit = "hour"), 
             interval15 = floor_date(started_at, unit = "15 mins"), 
             week = week(interval60), 
             dotw = wday(interval60, label=TRUE)) 
    dc_biketrips
    #>            started_at          interval60          interval15 week dotw
    #> 1 2020-11-01 00:05:00 2020-11-01 00:00:00 2020-11-01 00:00:00   44   So
    #> 2 2020-11-01 07:29:00 2020-11-01 07:00:00 2020-11-01 07:15:00   44   So
    #> 3 2020-11-01 14:04:00 2020-11-01 14:00:00 2020-11-01 14:00:00   44   So
    
    dc_biketrips %>% 
      filter(week < 15)
    #> [1] started_at interval60 interval15 week       dotw      
    #> <0 rows> (or 0-length row.names)
    

    【讨论】:

    • 感谢@stefan 的回复!这似乎也不起作用,因为我正在尝试创建时间间隔箱 - 并且在运行以下代码时没有任何结果: Bike_20 % mutate(interval60 = floor_date(mdy_hms(started_at), unit = "hour"), interval15 = floor_date(mdy_hms(started_at), unit = "15 mins"), week = week(interval60), dotw = wday(interval60, label=TRUE)) %>% filter(week
    • @Marie。不确定是什么问题。 as.POSIXct 和 mdy_hms 都可以正常工作。只有过滤会丢弃所有观察结果。查看我的编辑。
    • 嗯明白了。问题已解决 - 再次感谢您!
    【解决方案2】:

    您的两个选项中的第一个有效:

    library(lubridate)
    date <-mdy_hms(c("11/1/2020 0:05:00","11/1/2020 7:29:00","11/1/2020 14:04:00"))
    str(date)
    # POSIXct[1:3], format: "2020-11-01 00:05:00" "2020-11-01 07:29:00" "2020-11-01 14:04:00" 
    

    您的数据是如何“提取”的?

    【讨论】:

    • 非常感谢您的回复!我用 read.csv 提取了数据。我尝试使用您的建议(请参阅上面的更新图像),尽管它似乎也不起作用,因为该列仍被归类为字符,并且当我尝试创建时间间隔箱时,我得到 0 个结果(使用 Bike_20 % mutate(interval60 = floor_date(mdy_hms(started_at), unit = "hour"), interval15 = floor_date(mdy_hms(started_at), unit = "15 mins"), week = week(interval60), dotw = wday(interval60, label=TRUE)) %>% filter(week
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    相关资源
    最近更新 更多