时区转换是大家经常遇到的问题,本文的代码可以实现以下功能:
- 根据经纬度给出对应的时区
- 将UTC转换为当地时间
软件包:
timezonefinder 可根据所给的经纬度找到对应的时区信息。为节省计算时间,可以提前将相应的时区信息读入内存中,也即设置in_memory=True。
# Import packages
from timezonefinder import TimezoneFinder
import pandas as pd
# Find timezone based on longitude and latitude
tf = TimezoneFinder(in_memory=True)
longitude = -88
latitude = 36
local_time_zone = tf.timezone_at(lng=longitude, lat=latitude)
local_time_zone
'America/Chicago'
此处,我们利用pandas date_range函数创建了一个4小时间隔的时间序列。
# Create naive timestamps using pandas
test_naive = pd.date_range('2019-04-06', '2019-04-07', freq='4H')
test_naive
DatetimeIndex(['2019-04-06 00:00:00', '2019-04-06 04:00:00',
'2019-04-06 08:00:00', '2019-04-06 12:00:00',
'2019-04-06 16:00:00', '2019-04-06 20:00:00',
'2019-04-07 00:00:00'],
dtype='datetime64[ns]', freq='4H')
以上输出显示的时间序列是没有时区信息的,我们此处假设上面的时区是UTC,然后我们可以给它加上时区信息,所用到的函数是 tz_localize。
# Set time to be UTC
test_UTC = test_naive.tz_localize('UTC')
test_UTC
DatetimeIndex(['2019-04-06 00:00:00+00:00', '2019-04-06 04:00:00+00:00',
'2019-04-06 08:00:00+00:00', '2019-04-06 12:00:00+00:00',
'2019-04-06 16:00:00+00:00', '2019-04-06 20:00:00+00:00',
'2019-04-07 00:00:00+00:00'],
dtype='datetime64[ns, UTC]', freq='4H')
现在上面的时间序列已经有时区信息了,也即+00:00。 此时我们就可以利用pandas里的tz_convert 将UTC时间转换为任意时区的时间。
# Convert UTC to local time
test_local = test_UTC.tz_convert(local_time_zone)
test_local
DatetimeIndex(['2019-04-05 19:00:00-05:00', '2019-04-05 23:00:00-05:00',
'2019-04-06 03:00:00-05:00', '2019-04-06 07:00:00-05:00',
'2019-04-06 11:00:00-05:00', '2019-04-06 15:00:00-05:00',
'2019-04-06 19:00:00-05:00'],
dtype='datetime64[ns, America/Chicago]', freq='4H')
输出显示以上已经转化为 -05:00。有时候我们还需要将时间格式转换为原来的样式,也就是没有时区信息的格式,这时我们还可以用 tz_localize 这个函数,不过此时参数应该是None。
# Convert back to naive timestamps, but in local time zone.
test_local_naive = test_local.tz_localize(None)
test_local_naive
DatetimeIndex(['2019-04-05 19:00:00', '2019-04-05 23:00:00',
'2019-04-06 03:00:00', '2019-04-06 07:00:00',
'2019-04-06 11:00:00', '2019-04-06 15:00:00',
'2019-04-06 19:00:00'],
dtype='datetime64[ns]', freq='4H')
总结一下:
- tf.timezone_at: 根据经纬度得出所在时区
- tz_localize: 用于带时区和不时区信息的时间序列转换
- tz_convert: 转换为任意时区的当地时间
微信公众号:测度空间