谷歌数据分析Bellabeats项目:拆分Weight数据集日期时间列遇异常
解决Weight数据集Date列拆分问题
你的代码核心问题有两个:
- 直接覆盖了原
Date列:第一行weight$Date= as.POSIXct(...)把原本的字符串格式日期时间替换成了POSIXct时间戳,所以你觉得原列“被删除”了。 - 格式字符串写错了:第一个
%M是分钟,你应该用%m表示月份;另外时间部分的多余空格(比如%I:里的空格、%M :%S中间的空格)会导致解析失败,生成NA值。
修复后的代码
情况1:保留原始Date列(字符串格式),新增date和time列
# 先把原Date列复制一份,避免被覆盖 weight$original_date <- weight$Date # 正确解析日期时间(修正格式串) weight$datetime <- as.POSIXct(weight$original_date, format = "%m/%d/%Y %I:%M:%S %p", tz = Sys.timezone()) # 拆分出日期和时间列 weight$time <- format(weight$datetime, format = "%H:%M:%S") weight$date <- format(weight$datetime, format = "%m/%d/%Y")
情况2:不需要保留原始字符串列,只是想让Date列保留为时间戳,同时有拆分后的列
如果你只是觉得原列“消失”了,其实它只是变成了POSIXct类型,你可以调整代码,不覆盖原列,而是新建一个时间戳列:
# 新建datetime列存储解析后的时间戳,不碰原Date列 weight$datetime <- as.POSIXct(weight$Date, format = "%m/%d/%Y %I:%M:%S %p", tz = Sys.timezone()) # 拆分日期和时间 weight$time <- format(weight$datetime, format = "%H:%M:%S") weight$date <- format(weight$datetime, format = "%m/%d/%Y")
关键说明
- 格式串里的
%m是月份(01-12),%M是分钟(00-59),别搞混; - 时间部分的分隔符要和原数据完全匹配,原数据是
HH:MM:SS就写%I:%M:%S,别加多余空格; - 如果不确定原数据的格式,可以用
str(weight$Date)查看,或者用lubridate包的parse_date_time函数自动识别格式,更省心:
library(lubridate) weight$datetime <- parse_date_time(weight$Date, orders = "mdy IMS p") weight$time <- format(weight$datetime, "%H:%M:%S") weight$date <- format(weight$datetime, "%m/%d/%Y")
内容的提问来源于stack exchange,提问作者bacazach
相关产品推荐
相关产品推荐

