更改时间戳的utcoffset

时间:2016-12-23 15:54:36

标签: python datetime pandas

我知道有时当你在时区之间进行转换时,Python会对结果应该是什么感到困惑,因为时区很难。

from pandas import Timestamp

string = "1900-01-01 00:00:00"
ts = Timestamp(string, tz='US/Eastern')
print(ts)

Timestamp('1900-01-01 00:00:00-0456', tz='US/Eastern')

显然,抵消不应该是4小时56分钟。

当它出错时,有没有办法坚持utcoffset应该是什么?

我只能在美国/东方之间进行转换。和' UTC',所以偏移量应该只有四五个小时。我想做的是检查偏移量是否为整数小时数,然后再舍入到最接近的数字。

1 个答案:

答案 0 :(得分:4)

在1901-12-13 20:45:52之前,utcoffset是4小时56分钟。

您可以使用使用Olson database的pytz进行确认。这是Pandas用于执行时区计算的模块:

XMLUnit.setIgnoreWhitespace(true)
XMLUnit.setIgnoreComments(true)
XMLUnit.setIgnoreDiffBetweenTextAndCDATA(true)
XMLUnit.setNormalizeWhitespace(true)

XMLUnit.compareXML(expectedXml, actualXml)

这将打印美国/东部时区的所有utc过渡边界和utcoffets(以秒为单位)。前几行看起来像这样

import pytz
eastern = pytz.timezone('US/Eastern')
for utcdate, info in zip(
        eastern._utc_transition_times, eastern._transition_info):
    utcoffset, dstoffset, tzabbrev = info
    print('{} | {} '.format(utcdate, utcoffset.total_seconds()))

所以在1901-12-13 20:45:52之前,utcoffset是-17760秒(或者相当于4小时56分钟)。

使用pytz从本地时间生成时区感知日期的standard way是调用0001-01-01 00:00:00 | -17760.0 1901-12-13 20:45:52 | -18000.0 1918-03-31 07:00:00 | -14400.0 1918-10-27 06:00:00 | -18000.0 1919-03-30 07:00:00 | -14400.0 ... 方法:

localize

打印

import datetime as DT
import pytz
eastern = pytz.timezone('US/Eastern')
date = DT.datetime(1900,1,1)
local_date = eastern.localize(date)
print(local_date)

这确认了Pandas返回的时间戳是正确的:

1900-01-01 00:00:00-04:56