看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本案例有以下数据,不过开始时间和结束时间为UTC时间,现在需要转换为北京时间。
以下为数据及构造方法:
# 将以下时间转换为北京时区
import pandas as pd
import io
data = '''
start_time(UTC+0),end_time(UTC+0)
2020-08-03 23:50:27,2020-08-03 23:51:01
2020-08-03 11:02:27,2020-08-03 11:03:31
2020-08-01 12:17:48,2020-08-01 12:17:53
2020-08-01 12:08:58,2020-08-01 12:09:03
2020-08-03 04:29:22,2020-08-03 04:31:12
2020-08-03 03:43:07,2020-08-03 03:44:22
2020-08-01 12:16:08,2020-08-01 12:16:13
2020-07-31 22:35:36,2020-07-31 22:36:46
2020-08-01 13:48:55,2020-08-01 13:50:20
2020-08-02 14:11:08,2020-08-02 14:11:23
'''
df = pd.read_csv(io.StringIO(data))
df
# ...
将这些时间的时区转换为北京时间。
首先,读取数据后对列改名,因为要修改为北京时间,就不能有UTC+0字样:
df.rename({'start_time(UTC+0)':'start_time',
'end_time(UTC+0)':'end_time'},
axis=1
)
# 或者以下方法
df.rename(lambda x:x.replace('(UTC+0)','') ,axis=1)
在转换时间之前要把数据的类型转换为时间类型,然后再操作时区转换,也可以用astype同时操作:
(
df.rename(lambda x:x.replace('(UTC+0)','') ,axis=1) # 修改列名
.astype('datetime64[ns, Asia/Shanghai]') # 时区转换
)
'''
start_time end_time
2020-08-03 23:50:27+08:00 2020-08-03 23:51:01+08:00
2020-08-03 11:02:27+08:00 2020-08-03 11:03:31+08:00
2020-08-01 12:17:48+08:00 2020-08-01 12:17:53+08:00
2020-08-01 12:08:58+08:00 2020-08-01 12:09:03+08:00
2020-08-03 04:29:22+08:00 2020-08-03 04:31:12+08:00
2020-08-03 03:43:07+08:00 2020-08-03 03:44:22+08:00
2020-08-01 12:16:08+08:00 2020-08-01 12:16:13+08:00
2020-07-31 22:35:36+08:00 2020-07-31 22:36:46+08:00
2020-08-01 13:48:55+08:00 2020-08-01 13:50:20+08:00
2020-08-02 14:11:08+08:00 2020-08-02 14:11:23+08:00
'''
就完成了时区转换的操作。如果需求中的原数据本身就是 UTC 时间,需要转为北京时间,则需要先将时间指定为 UTC 时间,再转为北京时间:
(
df.rename(lambda x:x.replace('(UTC+0)','') ,axis=1) # 修改列名
.astype('datetime64[ns, utc]') # 指定时区
.astype('datetime64[ns, Asia/Shanghai]') # 时区转换
)
'''
start_time end_time
0 2020-08-04 07:50:27+08:00 2020-08-04 07:51:01+08:00
1 2020-08-03 19:02:27+08:00 2020-08-03 19:03:31+08:00
2 2020-08-01 20:17:48+08:00 2020-08-01 20:17:53+08:00
3 2020-08-01 20:08:58+08:00 2020-08-01 20:09:03+08:00
4 2020-08-03 12:29:22+08:00 2020-08-03 12:31:12+08:00
5 2020-08-03 11:43:07+08:00 2020-08-03 11:44:22+08:00
6 2020-08-01 20:16:08+08:00 2020-08-01 20:16:13+08:00
7 2020-08-01 06:35:36+08:00 2020-08-01 06:36:46+08:00
8 2020-08-01 21:48:55+08:00 2020-08-01 21:50:20+08:00
9 2020-08-02 22:11:08+08:00 2020-08-02 22:11:23+08:00
'''
在本例中,数据中的所有列为时间类型,如果在数据中只有指定的几列为时间,可以定义一个匿名函数来调用,以节省代码量:
df = df.rename(lambda x:x.replace('(UTC+0)','') ,axis=1) # 修改列名
to_utc8 = lambda x: x.astype('datetime64[ns, Asia/Shanghai]') # 定义函数
df.assign(start_time=to_utc8(df.start_time),
end_time=to_utc8(df.end_time))
这样就解决了问题。
(完)
更新时间:Aug. 18, 2024, 3:48 p.m. 标签:pandas python 时区