Python中将Unix时间戳列转换为pandas datetime时差10小时如何解决
问题原因
你的判断完全正确,10小时的时差就是因为处理时丢弃了时间字符串末尾的+1000时区标识导致的。
你拿到的/Date(xxx+1000)/是典型的ASP.NET AJAX序列化时间格式:
- 括号内加号前的数字是毫秒级Unix时间戳,对应的是UTC时区的时间
- 加号后的
+1000代表数据源展示的时间是UTC+10时区的本地时间
你之前的代码直接按+分割丢弃了偏移量,只取毫秒值调用pd.to_datetime,函数默认按UTC时区解析,得到的自然是比东十区本地时间晚10小时的UTC时间,和你现在的输出偏差完全吻合。
正确实现
不用手动拆分字符串,直接给pd.to_datetime传入匹配的格式串,就能自动识别时间戳和时区偏移,代码更简洁也不会出时区偏差:
import pandas as pd df = pd.DataFrame({ 'Time' : ['/Date(1642687260000+1000)/','/Date(1642688100000+1000)/'], }) # 按序列化格式直接解析,自动处理时区偏移 df['Time'] = pd.to_datetime(df['Time'], format='/Date(%Q%z)/') # 转换为东十区本地时间,去除时区标记,和数据源展示结果完全一致 df['Time'] = df['Time'].dt.tz_convert('+10:00').dt.tz_localize(None)
运行后输出和数据源给出的正确时间完全匹配:
Time 0 2022-01-21 00:01:00 1 2022-01-21 00:15:00
格式参数说明
%Q:pandas专门用来匹配毫秒级Unix时间戳的占位符%z:用来匹配±HHMM格式的时区偏移标识,会自动把时差计算到最终时间结果里
这种写法兼容所有同格式的带时区偏移时间串,后续如果数据源换了其他时区(比如+0800、-0500)也不需要修改代码,比手动拆分字符串鲁棒性强很多。
内容的提问来源于stack exchange,提问作者jonboy
相关产品推荐
相关产品推荐

