使用cut&label方法标记日期范围返回NA值问题求助
问题排查与解决方案
你的问题确实出在日期格式解析上,这是R处理日期时很容易踩的坑!
核心原因
当你用as.Date(c("10-03-2016", ...))时,R默认的日期解析格式是%Y-%m-%d(年-月-日),所以字符串"10-03-2016"会被错误解析成2010年3月20日,而不是你实际想要的2016年3月10日。这就导致你设置的breaks日期完全不符合预期,数据集里的所有date都不在这些错误的区间范围内,最终sentiment列全是<NA>。
修复步骤
指定正确的日期解析格式
在as.Date()中添加format = "%d-%m-%Y"参数,明确告诉R你的日期字符串是日-月-年的格式:# 先定义正确的breaks日期 break_dates <- as.POSIXct(as.Date( c("10-03-2016", "13-06-2016", "16-07-2017", "01-09-2017", "14-09-2017", "13-01-2018", "01-04-2018", "05-05-2018", "02-04-2019"), format = "%d-%m-%Y" ))验证breaks的合理性
运行print(break_dates)检查解析后的日期是否正确,同时确认这些日期的顺序是递增的,并且覆盖了你数据集里的date范围(你的数据从2016-03-11开始,第一个breaks是2016-03-10,刚好能包含所有数据)。重新生成sentiment列
用修正后的break_dates运行cut.POSIXt:tripsentiment$sentiment <- cut.POSIXt( tripsentiment$date, breaks = break_dates, labels = c("BULL", "BEAR", "BULL", "BEAR", "BULL", "BEAR", "BULL", "BEAR") )
额外优化建议
如果你经常处理不同格式的日期,推荐使用lubridate包的dmy()函数,它可以直接识别日-月-年格式的字符串,代码更简洁且不易出错:
library(lubridate) break_dates <- as.POSIXct(dmy(c("10-03-2016", "13-06-2016", ...)))
测试一下修正后的代码,你的sentiment列应该就能正确赋值了!
内容的提问来源于stack exchange,提问作者magisterludi
相关产品推荐
相关产品推荐

