使用Polars解析带时区偏移的字符串时,如何获取解析出的时区偏移?
提取Polars中日期时间字符串的时区偏移并转为Duration列
当使用Polars解析带时区偏移的日期时间字符串时,结果会自动转为UTC时间:
import polars as pl pl.Series(['2020-01-01T01:00+10:00']).str.to_datetime()
输出:
shape: (1,) Series: '' [datetime[μs, UTC]] [ 2019-12-31 15:00:00 UTC ]
这是因为Polars无法存储时区不统一的序列(比如包含夏令时变更的±1、±2偏移),统一转UTC是合理的处理逻辑。但如果需要单独提取并处理时区偏移,可以用以下两种方法:
方法1:Polars原生字符串处理+Duration转换
先通过正则提取偏移部分,再用str.to_duration转为Duration类型:
s = pl.Series(['2020-01-01T01:00+10:00', '2020-01-01T01:00-05:30', '2020-01-01T01:00+02:00']) # 提取结尾的时区偏移字符串 offset_str = s.str.extract(r'([+-]\d{2}:\d{2})$') # 转为Duration列 offset_duration = offset_str.str.to_duration("%H:%M") print(offset_duration)
输出:
shape: (3,) Series: '' [duration[μs]] [ 36000000000 -19800000000 7200000000 ]
正则r'([+-]\d{2}:\d{2})$'精准匹配字符串末尾的±HH:MM格式偏移,str.to_duration会自动识别正负号并转为对应的时长。
方法2:结合chrono库解析偏移
如果你更依赖chrono的解析能力,可以用map_elements调用chrono的FixedOffset来解析偏移字符串,再转为Polars Duration:
from chrono import FixedOffset s = pl.Series(['2020-01-01T01:00+10:00', '2020-01-01T01:00-05:30']) offset_duration = s.str.extract(r'([+-]\d{2}:\d{2})$').map_elements( lambda x: FixedOffset.parse(x).total_seconds() * 1_000_000, # 转为微秒 return_dtype=pl.Duration ) print(offset_duration)
输出和方法1一致,这种方法适合需要处理chrono支持的非标准偏移格式的场景。
内容的提问来源于stack exchange,提问作者Jarrad
相关产品推荐
相关产品推荐

