Home > Enterprise >  R: Lubridate Failing to Convert Character to Numeric
R: Lubridate Failing to Convert Character to Numeric

Time:12-05

I'm new to R - and searched old post for an answer but failed to come across anything that resolved my issue.

I pulled in a csv with the time a trip started in the mdy h:mm:ss format, but it is currently recognized as a character. I've tried to use mdy_hms(c("11/1/2020 0:05:00","11/1/2020 7:29:00","11/1/2020 14:04:00")) as well as as.Date(parse_date_time(dc_biketrips$started_at, c(mdy_hms))) to no avail.

Does anyone have any suggestions for how I could fix this?

UPDATE: I also tried to use date <-mdy_hms(c("11/1/2020 0:05:00","11/1/2020 7:29:00","11/1/2020 14:04:00")) str(date)but this also did not work

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

image of csv

CodePudding user response:

The first of your two options works:

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" 

How were your data "pulled in"?

CodePudding user response:

One option would be to use 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"

EDIT

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. Both as.POSIXct and lubridate::mdy_hms return an object of class "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. Not sure what you expect. When I run your code everything works fine except that we end up with 0 obs after filtering for week < 15 as all the dates in the example data are from week 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)
  • Related