使用df.to_json时丢失英国夏令时转换日(30 Mar 25)数据求助
问题原因
你遇到的是夏令时(DST)转换导致的物理时长与日历天不匹配问题:
- 英国2025年3月30日切换夏令时,当天本地时间仅23小时(时钟从01:00直接拨快到02:00)。
- 你用
86400000ms(固定24小时物理时长)重采样,而非基于日历的天规则。这种情况下,pandas会从起始时间累加24小时生成采样窗口,跳过了实际的3月30日本地时间窗口,导致该日数据被合并到3月31日的窗口中。 - DataFrame显示时可能因为时区渲染的问题看起来正常,但底层索引的时间戳已经偏移,转JSON时(默认按UTC或原始时间戳序列化)就会暴露数据错位。
解决方案
1. 确保时间戳带时区
先将原始毫秒时间戳转换为**带伦敦时区(Europe/London)**的datetime对象,避免无时区时间导致的混乱:
import pandas as pd # 假设原始数据列名为'timestamp'和'value' df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms').dt.tz_localize('Europe/London') df = df.set_index('timestamp')
2. 用日历天规则重采样
放弃固定毫秒数,使用pandas的日历天规则'D',它会严格按照本地日历的每一天划分窗口,自动适配夏令时的时长变化:
# 替换成你实际使用的聚合函数(比如sum、max等) resampled_df = df.resample('D').mean()
3. 正确序列化JSON
转JSON时指定ISO日期格式,确保时区信息被正确保留,避免时间戳错位:
resampled_df.to_json('output.json', date_format='iso', orient='index')
验证结果
执行完上述步骤后,查看resampled_df.index,你会看到每个日期都是伦敦时区的当日起始时间(如2025-03-30 00:00:00+00:00),转JSON后3月30日的数据会正常显示,不会被合并到31日。
内容的提问来源于stack exchange,提问作者iss42
相关产品推荐
相关产品推荐

