R Markdown中字符转POSIXct时分秒固定为19:00:00如何解决
问题根因
你的转换代码有三个核心错误,导致时分秒丢失、时间偏移:
- 先调用
as.Date()处理原始字符串:Date类型仅存储年月日信息,这一步已经把所有时分秒数据丢弃,后续转换无法找回这部分内容。且你传给as.POSIXct()的第一个参数已经是Date对象,后续写的format参数不会对Date类型输入生效,完全没有作用。 - 格式字符串与原始值不匹配:原始时间是
2021-04-12T18:25:36Z格式的ISO8601时间串,你写的format="%Y/%m/%d/%H/%M/%S"对应斜杠分隔的时间格式,即使直接处理原始字符也无法正确匹配。 - 未指定时区:原始时间结尾的
Z代表UTC时区,不手动指定时区参数时,R会调用本地系统时区做解析,很容易出现日期、时间偏移。
你看到所有记录时分秒固定为19:00:00、日期差1天,就是因为转Date环节已经丢失了时分秒,还因为时区差导致日期偏移,后续转POSIXct时只能给丢失的时间部分填充固定默认值。
修复方案
直接对原始字符做POSIXct转换,跳过as.Date()环节,同时指定匹配的格式和正确时区:
# 类型转换 all_trips_v2_rmd$started_at <- as.POSIXct( as.character(all_trips_v2_rmd$started_at), format = "%Y-%m-%dT%H:%M:%SZ", tz = "UTC" ) # 验证结果 is.POSIXct(all_trips_v2_rmd$started_at) head(all_trips_v2_rmd$started_at)
格式符对应说明:
%Y-%m-%d匹配年-月-日部分- 字面量
T匹配原始串中日和时间之间的T字符 %H:%M:%S匹配时:分:秒部分- 字面量
Z匹配结尾的UTC时区标识 tz = "UTC"指定解析后的时间时区为UTC,和原始时间一致,不会出现偏移
如果不想手动写格式匹配规则,也可以用lubridate包的解析函数,自动识别ISO8601格式时间:
library(lubridate) all_trips_v2_rmd$started_at <- ymd_hms( as.character(all_trips_v2_rmd$started_at), tz = "UTC" )
额外提示
用write_csv()写出数据时,如果不想每次读入都手动做类型转换,可以换用saveRDS()保存R原生的RDS格式文件,会保留所有列的原有类型,读入时不需要重新做类型修正。
内容的提问来源于stack exchange,提问作者gamer moment in progress
相关产品推荐
相关产品推荐

