UNIX格式int64时间戳转datetime始终返回1970年问题咨询
问题根因
你输入的测试时间戳1545003901为秒级UNIX时间戳,对应真实时间为2018-12-17 01:05:01。你当前代码设置unit='ms',会将输入数值按照毫秒单位计算,1545003901毫秒仅等于1545003.9秒,距离UNIX元年(1970-01-01)仅17天,因此输出1970年附近的错误时间。
无效操作说明
- 你额外添加的
format='%Y/%m/%d %H:%M:%S'参数对数值型时间戳完全不生效,该参数仅用于解析字符串格式的时间输入,添加后不会产生任何作用。 - 若你曾调整
unit='s'后仍得到错误结果,优先排查是否未重新执行全量代码、是否存在缓存问题。
修复代码
正确时间转换逻辑
# 单位改为秒s即可匹配输入的时间戳量级 weather['time_stamp'] = pd.to_datetime(weather['time_stamp'], origin='unix', unit='s')
冗余代码优化
你后续提取年、月、日、时、分的写法可直接用datetime列的dt属性,不需要用lambda遍历,效率更高:
weather['year'] = weather['time_stamp'].dt.year weather['month'] = weather['time_stamp'].dt.month weather['day'] = weather['time_stamp'].dt.day weather['hour'] = weather['time_stamp'].dt.hour weather['minute'] = weather['time_stamp'].dt.minute
语法错误修复
你最后一行抽样代码缺了右括号,修正后为:
weather.take(np.random.permutation(len(weather))[:15])
异常排查方案
如果调整单位后仍存在转换错误,按以下步骤排查:
- 单独执行测试用例验证转换逻辑:
pd.to_datetime(1545003901, origin='unix', unit='s'),正常输出应为2018-12-17 01:05:01 - 检查
weather['time_stamp']列的取值范围,确认所有值都是10位左右的秒级时间戳,无13位毫秒值、空值、异常小值混入 - 检查列的数据类型是否为纯int64数值型,无字符串、特殊字符等脏数据
内容的提问来源于stack exchange,提问作者Stephanie Omwanda
相关产品推荐
相关产品推荐

