import pandas as pdimport numpy as np
import pytz
1.通過common_timezone可以獲得所有時區(qū)的名稱
pytz.common_timezones[-5:]
['US/Eastern', 'US/Hawaii', 'US/Mountain', 'US/Pacific', 'UTC']
2.通過timezone可以獲取時間對象
tz = pytz.timezone('US/Eastern')tz
<DstTzInfo 'US/Eastern' LMT-1 day, 19:04:00 STD>
1.pandas中的時間序列默認是naive時區(qū),也就是沒有時區(qū)的
rng = pd.date_range('3/9/2018 22:29',periods=5,freq='D') # 生成范圍日期時可以加上時區(qū)信息ts = pd.Series(np.random.randn(len(rng)),index=rng)ts
2018-03-09 22:29:00 -0.4222592018-03-10 22:29:00 -0.4115702018-03-11 22:29:00 0.4996412018-03-12 22:29:00 0.8911932018-03-13 22:29:00 -0.966908Freq: D, dtype: float64
2.通過tz_localize方法可以為沒有時區(qū)的時間序列賦予時區(qū)
ts_utc = ts.tz_localize('UTC')ts_utc
2018-03-09 22:29:00+00:00 -0.4222592018-03-10 22:29:00+00:00 -0.4115702018-03-11 22:29:00+00:00 0.4996412018-03-12 22:29:00+00:00 0.8911932018-03-13 22:29:00+00:00 -0.966908Freq: D, dtype: float64
3.一旦時間序列被本地化到某個特定時區(qū),就可以用tz_convert將其轉(zhuǎn)換到別的時區(qū)了
ts_eastern = ts_utc.tz_convert('US/Eastern')ts_eastern
2018-03-09 17:29:00-05:00 -0.4222592018-03-10 17:29:00-05:00 -0.4115702018-03-11 18:29:00-04:00 0.4996412018-03-12 18:29:00-04:00 0.8911932018-03-13 18:29:00-04:00 -0.966908Freq: D, dtype: float64
ts_eastern.tz_convert('UTC')
2018-03-09 22:29:00+00:00 -0.4222592018-03-10 22:29:00+00:00 -0.4115702018-03-11 22:29:00+00:00 0.4996412018-03-12 22:29:00+00:00 0.8911932018-03-13 22:29:00+00:00 -0.966908Freq: D, dtype: float64
4.tz_localize和tz_convert也是DatetimeIndex的實例方法
ts.index.tz_localize('Asia/Shanghai')
DatetimeIndex(['2018-03-09 22:29:00+08:00', '2018-03-10 22:29:00+08:00', '2018-03-11 22:29:00+08:00', '2018-03-12 22:29:00+08:00', '2018-03-13 22:29:00+08:00'], dtype='datetime64[ns, Asia/Shanghai]', freq='D')
1.Timestamp對象也能被從navie本地化為時區(qū)意識型(time zone-aware)
stamp = pd.Timestamp('2018-7-5 22:40')stamp
Timestamp('2018-07-05 22:40:00')
stamp_utc = stamp.tz_localize('utc')
2.創(chuàng)建Timestamp時,還可以傳入一個時區(qū)信息
stamp_moscow = pd.Timestamp('2018-7-5 22:41',tz='Europe/Moscow')stamp_moscow
Timestamp('2018-07-05 22:41:00+0300', tz='Europe/Moscow')
3.時區(qū)意識型Timestamp對象內(nèi)部保存了一個utc時間戳值,這個值在時區(qū)的轉(zhuǎn)換過程中是不會變化的
print(stamp_utc.value)print(stamp_utc.tz_convert('US/Eastern').value)
15308304000000000001530830400000000000
4.當(dāng)使用日期偏移量執(zhí)行計算時,運算過程會自動關(guān)注是否存在夏令時轉(zhuǎn)變期
from pandas.tseries.offsets import Hour
stamp = pd.Timestamp('2012-03-12 01:30',tz='US/Eastern')print(stamp)print(stamp+Hour()) # 不涉及夏令時轉(zhuǎn)變期
2012-03-12 01:30:00-04:002012-03-12 02:30:00-04:00
stamp = pd.Timestamp('2012-11-04 00:30',tz='US/Eastern')print(stamp)print(stamp+Hour(2)) # 涉及夏令時轉(zhuǎn)變期
2012-11-04 00:30:00-04:002012-11-04 01:30:00-05:00
兩個時間序列的時區(qū)不同,在將它們合并到一起時,最終結(jié)果就會是UTC。
rng = pd.date_range('7/5/2018 22:50',periods=10,freq='B')ts = pd.Series(np.random.randn(len(rng)),index=rng)
ts1 = ts[:7].tz_localize('Europe/London')ts2 = ts1[2:].tz_convert('Europe/Moscow')
ts1
2018-07-05 22:50:00+01:00 0.8162652018-07-06 22:50:00+01:00 -0.5162422018-07-09 22:50:00+01:00 0.3591662018-07-10 22:50:00+01:00 -2.2383962018-07-11 22:50:00+01:00 -1.5163652018-07-12 22:50:00+01:00 -1.7348322018-07-13 22:50:00+01:00 -0.063531Freq: B, dtype: float64
ts2
2018-07-10 00:50:00+03:00 0.3591662018-07-11 00:50:00+03:00 -2.2383962018-07-12 00:50:00+03:00 -1.5163652018-07-13 00:50:00+03:00 -1.7348322018-07-14 00:50:00+03:00 -0.063531Freq: B, dtype: float64
result = ts1 + ts2result
2018-07-05 21:50:00+00:00 NaN2018-07-06 21:50:00+00:00 NaN2018-07-09 21:50:00+00:00 0.7183322018-07-10 21:50:00+00:00 -4.4767922018-07-11 21:50:00+00:00 -3.0327312018-07-12 21:50:00+00:00 -3.4696632018-07-13 21:50:00+00:00 -0.127062Freq: B, dtype: float64