
Time zone handling
While, by default, Pandas objects are time zone unaware, many real-world applications will make use of time zones. As with working with time in general, time zones are no trivial matter: do you know which countries have daylight saving time and do you know when the time zone is switched in those countries? Thankfully, Pandas builds on the time zone capabilities of two popular and proven utility libraries for time and date handling: pytz
and dateutil
:
>>> t = pd.Timestamp('2000-01-01') >>> t.tz is None True
To supply time zone information, you can use the tz
keyword argument:
>>> t = pd.Timestamp('2000-01-01', tz='Europe/Berlin') >>> t.tz <DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>
This works for ranges
as well:
>>> rng = pd.date_range('1/1/2000 00:00', periods=10, freq='D', tz='Europe/London') >>> rng DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04', '2000-01-05', '2000-01-06', '2000-01-07', '2000-01-08','2000-01-09', '2000-01-10'], dtype='datetime64[ns]', freq='D', tz='Europe/London')
Time zone objects can also be constructed beforehand:
>>> import pytz >>> tz = pytz.timezone('Europe/London') >>> rng = pd.date_range('1/1/2000 00:00', periods=10, freq='D', tz=tz) >>> rng DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04', '2000-01-05', '2000-01-06', '2000-01-07', '2000-01-08', '2000-01-09', '2000-01-10'], dtype='datetime64[ns]', freq='D', tz='Europe/London')
Sometimes, you will already have a time zone unaware time series object that you would like to make time zone aware. The tz_localize
function helps to switch between time zone aware and time zone unaware objects:
>>> rng = pd.date_range('1/1/2000 00:00', periods=10, freq='D') >>> ts = pd.Series(np.random.randn(len(rng)), rng) >>> ts.index.tz is None True >>> ts_utc = ts.tz_localize('UTC') >>> ts_utc.index.tz <UTC>
To move a time zone aware object to other time zones, you can use the tz_convert
method:
>>> ts_utc.tz_convert('Europe/Berlin').index.tz <DstTzInfo 'Europe/Berlin' LMT+0:53:00 STD>
Finally, to detach any time zone information from an object, it is possible to pass None
to either tz_convert
or tz_localize
:
>>> ts_utc.tz_convert(None).index.tz is None True >>> ts_utc.tz_localize(None).index.tz is None True