R中运行日期筛选代码时报未知时区'%m/%d/%y'错误如何解决?
错误原因排查
- 你调用
as.Date(Level1$starttime, "%m/%d/%y")时,Level1$starttime已经是POSIXct/POSIXlt类型的时间对象,不是字符串。as.Date处理POSIX类型输入时,第二个传入的参数会被识别为时区参数tz,你传入的格式字符串%m/%d/%y不是合法的时区名称,因此触发警告。 - 额外冗余问题:代码嵌套了两层
subset,其实单层subset即可同时完成行筛选和列选择,嵌套写法会降低代码可读性。
解决方法
情况1:starttime为POSIX时间类型
先执行class(Level1$starttime)验证类型,如果返回结果包含POSIXct/POSIXlt,直接去掉as.Date的格式参数即可:
result <- subset(Level1, as.Date(starttime) < as.Date("2021-07-31"), select = c("b_en_id", "starttime", "endtime", "child_name") )
情况2:starttime为字符串类型
如果验证后是字符串类型,明确指定format参数名,避免参数顺序匹配错误:
result <- subset(Level1, as.Date(starttime, format = "%m/%d/%y") < as.Date("7/31/21", format = "%m/%d/%y"), select = c("b_en_id", "starttime", "endtime", "child_name") )
优化建议
- 阈值日期尽量用
YYYY-MM-DD的标准ISO格式书写,无需额外指定format参数,可降低解析出错概率 - 如果后续还要多次使用日期字段,建议提前新增一列存储格式化后的日期值,避免重复解析
内容的提问来源于stack exchange,提问作者Maynard_Keynes
相关产品推荐
相关产品推荐

