R:Lubridate 无法将字符转换为数字
Posted
技术标签:
【中文标题】R:Lubridate 无法将字符转换为数字【英文标题】:R: Lubridate Failing to Convert Character to Numeric 【发布时间】: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
【问题讨论】:
【参考方案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")
as.POSIXct
和 lubridate::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"
-
不确定您的期望。当我运行您的代码时,一切正常,除了在过滤
week < 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以上是关于R:Lubridate 无法将字符转换为数字的主要内容,如果未能解决你的问题,请参考以下文章
为啥 R lubridate::duration 数据类型使用 sparklyr 转换为 spark 中的字符?
as.Date函数将字符串转化为日期as.Date指定format的格式lubridate包日期格式转换系统日期系统时间日期比较日期差lubridate包获取关系日期的详细信息