Python技术迷

Python Pandas中的时区转换与日期运算

群里有个同事问我 pandas 那个带时区的时间戳到底咋整,经常一做数据透视表结果全乱套,尤其是遇到那个UTC和本地时间,脑壳嗡嗡的。你们是不是也经常碰到?我前几天刚把一堆log数据处理成上海时间,搞得头有点大,顺手在本子上记了点经验,今儿跟你们聊聊。

pandas 里时区到底有啥用?

其实一般刚开始学 pandas,大家直接 pd.to_datetime(),拿到的就是时区不带信息的 datetime64[ns],特别纯洁(嗯,没毛病)。但只要你碰上跨时区数据,比如服务器UTC、业务数据东八区,或者爬国外网站,光裸奔着用时间戳,很快就闹心了。那种「差8小时」你没遇到过吗?反正我之前被坑过好几次。

怎么加时区?一行代码很快

比如说你拿了个数据表,有一列全是“2024-07-10 09:30:00”这种,先转成 datetime:

import pandas as pd

df = pd.DataFrame({
'dt': ['2024-07-10 09:30:00', '2024-07-10 12:00:00']
})
df['dt'] = pd.to_datetime(df['dt'])

这样还没加时区,直接看 type:

print(df['dt'].dt.tz)
# 输出 None

加时区,直接 .dt.tz_localize('Asia/Shanghai'),不是 tz_convert,这个区别你们一定要分清,不然踩坑。

df['dt'] = df['dt'].dt.tz_localize('Asia/Shanghai')
print(df['dt'])

一眼看出加了“+08:00”。如果你本来那列带时区,比如UTC,就用 .dt.tz_convert('Asia/Shanghai')。千万别反了,这俩方法搞混了,pandas会直接给你来一句“Already tz-aware, use tz_convert instead”。

跨时区的坑,别自己加减小时

你有时候看 UTC 和北京时间差 8 小时,老想直接 df['dt'] + pd.Timedelta(hours=8)。我劝你别这么干,这样加完数据类型还是 tz-naive 的 datetime,万一原始数据有遗漏,坑自己不浅。标准姿势还是 .dt.tz_localize('UTC').dt.tz_convert('Asia/Shanghai'),官方推荐。

比如有 UTC 的时间戳:

df['dt'] = pd.to_datetime(df['dt']).dt.tz_localize('UTC').dt.tz_convert('Asia/Shanghai')

你直接加减小时,日期溢出、夏令时全乱套。

日期运算,带不带时区大不同

我有一次在公司楼下抽烟,聊着聊着被问,你们 groupby 做日汇总时,发现为啥少一天?原来是时间带时区和不带时区搞混了。你直接用 dt.date,如果没先转到本地时区,算出来的日期就是UTC那一天,和国内的业务一天不对口。

比如:

df['date'] = df['dt'].dt.date

建议先 .dt.tz_convert('Asia/Shanghai') 再 .dt.date,别偷懒。否则你以为 2024-07-10 00:30 UTC 算 10 号,实际上东八区还是 7 号早上 8:30,对账直接对不齐。

时间差咋算?小心溢出

再有个常见需求就是算两个时间的差,比如 “工单处理时长” 这种。这个还得分你俩时间列是不是一个时区。最好都统一先转成同一个时区(比如都变成 Asia/Shanghai),再 df['dt2'] - df['dt1'],不然有警告。

df['dt1'] = df['dt1'].dt.tz_convert('Asia/Shanghai')
df['dt2'] = df['dt2'].dt.tz_convert('Asia/Shanghai')
df['diff'] = df['dt2'] - df['dt1']

反正就是 pandas 玩时间,时区是个绕不过去的坑,千万别嫌麻烦,不然踩雷自己填。带不带 tz 信息处理逻辑全变,尤其是跨国数据、服务器log,先统一时区再运算,别偷懒。实在记不住,就每次 .dt.tz_convert('Asia/Shanghai') 兜底,没毛病。

哦,对了,我还遇到一个奇葩场景,有的接口吐出来一串 ISO 格式,还带 Z,直接 pd.to_datetime 那种“2024-07-10T08:30:00Z”,pandas 秒变带 tz 的 datetime,根本不用自己加时区,很爽。

-END-

我为大家打造了一份RPA教程,完全免费:https://www.songshuhezi.com/rpa.html

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领