支持夏令时的欧洲/伦敦时区时段小时数精准计算方案问询
可靠计算欧洲/伦敦时区含夏令时时段小时数的方案
问题原因
你之前的方法在2024年3月失效,核心问题是pd.offsets.MonthEnd() + pd.Timedelta(days=1)的组合没有正确处理夏令时切换后的时区偏移,导致生成的结束时间与实际时段边界偏差,进而时间差计算错误。
推荐方案一:基于UTC时间差计算(高效准确)
UTC时区无夏令时切换,将本地时间转换为UTC后计算差值,即可得到实际流逝的小时数:
import pandas as pd # 定义起始时间(时区感知) s = pd.to_datetime('2024-03-01').tz_localize('Europe/London') # 生成下一个月首日00:00的本地时间作为结束点 e = s + pd.DateOffset(months=1) # 转换为UTC计算时间差 utc_start = s.tz_convert('UTC') utc_end = e.tz_convert('UTC') total_hours = (utc_end - utc_start) / pd.Timedelta(hours=1) print(total_hours) # 输出:743.0
方案二:生成小时级时间序列计数(直观易验证)
通过生成时段内所有小时的时间戳,直接统计数量,完全规避时区转换带来的计算误差:
import pandas as pd s = pd.to_datetime('2024-03-01').tz_localize('Europe/London') e = s + pd.DateOffset(months=1) # 生成左闭右开的每小时时间序列 hourly_timestamps = pd.date_range(start=s, end=e, freq='H', inclusive='left') total_hours = len(hourly_timestamps) print(total_hours) # 输出:743
结果验证
2024年3月英国夏令时切换发生在3月31日01:00,时钟直接跳至02:00,因此3月实际总小时数为31×24-1=743,上述两种方案均能得到正确结果。
内容的提问来源于stack exchange,提问作者r0bt
相关产品推荐
相关产品推荐

