Vaex中正确格式化时间戳:移除UTC偏移中的冒号
解决Vaex中带UTC冒号偏移的时间戳解析问题
问题根源
你遇到的ValueError是因为Python标准库的datetime.strptime中,%z格式符仅支持不带冒号的UTC偏移格式(如+0000),但你的时间戳字符串是带冒号的+00:00,同时格式字符串里%S和%z之间多了一个空格,和原字符串的结构不匹配,导致解析失败。
解决方案
下面提供两种高效的处理方式,优先推荐Vaex内置函数(避免低效的逐行apply):
方法1:用Vaex内置to_datetime自动兼容
Vaex的to_datetime函数可以自动识别带冒号的UTC偏移,无需手动修改字符串,代码更简洁且效率更高:
import vaex as vx import pandas as pd # 原始数据创建 df = pd.DataFrame({'quantity' : [0,6,4,3,7,8,3,2], 'timestamp' : ['2018-05-01 03:05:00+00:00', '2018-05-01 04:15:00+00:00', '2018-06-02 03:15:00+00:00', '2018-06-02 04:25:00+00:00', '2018-07-03 03:25:00+00:00', '2018-07-03 04:35:00+00:00', '2018-08-04 03:35:00+00:00', '2018-08-04 04:45:00+00:00'], 'id' : [1,2,3,4,5,6,7,8] }) df = vx.from_pandas(df=df, copy_index=True) # 直接解析,无需手动处理偏移 df['timestamp_parsed'] = df['timestamp'].to_datetime() # 如果需要指定格式(可选) # df['timestamp_parsed'] = df['timestamp'].to_datetime(format="%Y-%m-%d %H:%M:%S%z")
方法2:手动移除UTC偏移中的冒号(兼容低版本Vaex)
如果你的Vaex版本较旧,内置函数不支持带冒号的偏移,可以用矢量化字符串替换先清理格式,再解析:
import vaex as vx import pandas as pd from datetime import datetime import numpy as np # 原始数据创建(同上) df = pd.DataFrame({'quantity' : [0,6,4,3,7,8,3,2], 'timestamp' : ['2018-05-01 03:05:00+00:00', '2018-05-01 04:15:00+00:00', '2018-06-02 03:15:00+00:00', '2018-06-02 04:25:00+00:00', '2018-07-03 03:25:00+00:00', '2018-07-03 04:35:00+00:00', '2018-08-04 03:35:00+00:00', '2018-08-04 04:45:00+00:00'], 'id' : [1,2,3,4,5,6,7,8] }) df = vx.from_pandas(df=df, copy_index=True) # 矢量化替换:移除UTC偏移中的冒号 df['timestamp_clean'] = df['timestamp'].str.replace(r'(\+\d{2}):(\d{2})$', r'\1\2', regex=True) # 用匹配的格式解析(注意%z前无空格) date_format = "%Y-%m-%d %H:%M:%S%z" df['timestamp_parsed'] = df['timestamp_clean'].apply(lambda x: np.datetime64(datetime.strptime(x, date_format)))
注意事项
- 尽量避免使用
apply逐行处理数据,Vaex的矢量化操作(如str.replace、内置to_datetime)性能远高于逐行处理,尤其适合大数据集。 - 如果你的时间戳都是UTC+00:00,也可以直接截断偏移部分,解析为本地时间后再设置时区,但不如上述方法通用。
内容的提问来源于stack exchange,提问作者Rebecca James
相关产品推荐
相关产品推荐

