Polars处理夏令时/冬令时时间戳转换报错及本地时间转换方案
解决Polars转换跨夏令时/冬令时时间戳的报错问题
Polars不允许单个Datetime列同时存在多个时区偏移,这就是你遇到ComputeError: Different timezones found的原因。下面针对你的两个需求给出具体解决方案:
方案一:基于带偏移的时间戳字符串处理
先逐个解析时间戳为带时区的时间对象,统一转成UTC后再转回目标本地时区,绕开列级时区冲突:
import polars as pl from datetime import datetime testdata=[ {'name': 'BST 11:06', 'ts': '2022:06:27 11:06:12.16+01:00'}, {'name': 'GMT 7:06', 'ts': '2022:12:27 12:06:12.16+00:00'}, ] pdf = pl.DataFrame(testdata) # 1. 逐个解析时间戳并转成UTC,绕开列级时区检查 pdfts = pdf.with_columns( pl.col('ts').map_elements( lambda x: datetime.strptime(x, "%Y:%m:%d %H:%M:%S.%f%z").astimezone(datetime.timezone.utc), return_dtype=pl.Datetime(time_unit='ns', time_zone='UTC') ).alias('utc_ts') ) # 2. 转换到目标本地时区(示例用伦敦时区,替换成你的实际时区城市) pdfts = pdfts.with_columns( pl.col('utc_ts').dt.convert_time_zone('Europe/London').alias('local_tz_ts') ) # 3. 生成用于显示的本地时钟时间字符串 pdfts = pdfts.with_columns( pl.col('local_tz_ts').dt.strftime("%Y:%m:%d %H:%M:%S.%f").alias('local_display') ) print(pdfts)
方案二:利用元数据的本地时间与时区城市(更可靠)
既然你的元数据里有「Time Zone City」和本地naive时间戳,直接用这两个字段构建带时区的Datetime,Polars会自动处理夏令时/冬令时切换,比依赖偏移字符串更准确:
import polars as pl # 模拟包含完整元数据的测试数据 testdata_with_meta=[ {'name': 'BST 11:06', 'local_ts': '2022:06:27 11:06:12.16', 'time_zone_city': 'Europe/London'}, {'name': 'GMT 7:06', 'local_ts': '2022:12:27 12:06:12.16', 'time_zone_city': 'Europe/London'}, ] pdf_meta = pl.DataFrame(testdata_with_meta) # 解析本地时间并关联时区城市,自动处理夏令时 pdfts_meta = pdf_meta.with_columns( pl.col('local_ts').str.strptime(pl.Datetime, fmt="%Y:%m:%d %H:%M:%S.%f") .dt.replace_time_zone(pl.col('time_zone_city')) .alias('local_tz_ts') ) # 可选:转换为UTC统一存储 pdfts_meta = pdfts_meta.with_columns( pl.col('local_tz_ts').dt.convert_time_zone('UTC').alias('utc_ts') ) print(pdfts_meta)
核心要点
- Polars的Datetime列强制单一时区,必须统一到UTC或目标时区才能避免报错。
- 使用时区城市(如
Europe/London)而非固定偏移,能自动适配夏令时切换,结果更可靠。 dt.convert_time_zone用于跨时区转换,dt.replace_time_zone用于给无时区的时间戳指定时区。
内容的提问来源于stack exchange,提问作者pootle
相关产品推荐
相关产品推荐

