在R脚本中将ArcGIS返回的字符串型时间戳转为可读日期
解决ArcGIS Rest服务获取的Epoch时间戳转可读日期问题
我来帮你搞定这个全NA的问题!核心原因很简单:你用错了解析规则——WVK_BEGDAT是字符串格式的Unix时间戳(Epoch时间),也就是从1970-01-01 00:00:00 UTC开始累计的秒/毫秒数,但你却用format="%d-%m-%Y"去解析,这个参数是用来处理像"01-05-2023"这类格式化日期字符串的,完全不匹配Epoch时间的逻辑,所以as_date才会返回全NA。
下面是具体的修复步骤:
1. 先确认时间戳的类型(秒/毫秒)
首先查看WVK_BEGDAT的实际值,判断是秒级还是毫秒级Epoch:
# 打印前几个时间戳示例 head(NWB$WVK_BEGDAT)
- 如果是10位数字(比如
1620000000),属于秒级时间戳 - 如果是13位数字(比如
1620000000000),则是毫秒级时间戳
2. 转换为人类可读日期
第一步:把字符串转为数值型
Epoch时间本质是数字,所以先把字符串列转成数值:
NWB$WVK_BEGDAT_num <- as.numeric(NWB$WVK_BEGDAT)
第二步:用lubridate解析为日期
根据时间戳类型选择对应代码:
情况1:秒级时间戳
# 转换为日期,指定时区为CET NWB$WVK_BEGDAT2 <- as_date(NWB$WVK_BEGDAT_num, origin = "1970-01-01", tz = "CET")
情况2:毫秒级时间戳
需要先除以1000转换为秒:
NWB$WVK_BEGDAT2 <- as_date(NWB$WVK_BEGDAT_num / 1000, origin = "1970-01-01", tz = "CET")
更直观的替代方案:用as_datetime处理
如果需要保留时间部分,或者想更清晰地管理时区,可以先用as_datetime解析为完整时间,再提取日期:
# 秒级示例 NWB$WVK_BEGDAT_datetime <- as_datetime(NWB$WVK_BEGDAT_num, tz = "CET") # 毫秒级示例 NWB$WVK_BEGDAT_datetime <- as_datetime(NWB$WVK_BEGDAT_num / 1000, tz = "CET") # 提取日期部分(如果只需要日期) NWB$WVK_BEGDAT2 <- as_date(NWB$WVK_BEGDAT_datetime)
3. 验证转换结果
转换完成后,用下面的代码查看前几条数据的转换效果,确认是否正确:
head(NWB[c("WVK_BEGDAT", "WVK_BEGDAT2")])
内容的提问来源于stack exchange,提问作者Egge-Jan Pollé
相关产品推荐
相关产品推荐

