时区更改为北极 TICKSTORE 中的本地 tz

时间:2021-02-17 17:11:43

标签: python-3.x mongodb

我正在尝试使用 Arctic 包中的 TICKSTORE 设置刻度数据库。当我从文档 (link) 运行示例并使用 UTC 日期时间索引编写数据帧时,读回数据返回 df 索引为“欧洲/柏林”,我的电脑的本地时区。

有没有办法返回 UTC 时间戳中的数据?

代码示例:

from arctic import Arctic, TICK_STORE
from datetime import datetime as dt
import pandas as pd

from arctic.date._mktz import mktz


db = Arctic('localhost')
db.delete_library('temp')
db.initialize_library('temp', lib_type=TICK_STORE)
tickstore_lib = db['temp']

data = [{'A': 120, 'D': 1}, {'A': 122, 'B': 2.0}, {'A': 3, 'B': 3.0, 'D': 1}]
tick_index = [dt(2013, 6, 1, 12, 00, tzinfo=mktz('UTC')),
              dt(2013, 6, 1, 11, 00, tzinfo=mktz('UTC')),  # Out-of-order
              dt(2013, 6, 1, 13, 00, tzinfo=mktz('UTC'))]

data = pd.DataFrame(data, index=tick_index)

tickstore_lib._chunk_size = 3
tickstore_lib.write('SYM', data)
print(tickstore_lib.read('SYM', columns=None).index)

我运行的是 Windows 10、Mongo Server 4.4、Arctic 1.80.0、python 3.7。

1 个答案:

答案 0 :(得分:0)

我猜北极将索引存储为 utc。当您读取数据时,arctic 作为包装器或 mongo 会将调整后的索引转换为您操作系统的时区。

我不认为避免这种操作是一个好的解决方案。那么你可能需要更改Arctic 库的源代码。也许更好的解决方案是删除数据帧时间戳列中的时区信息,并生成原始 UTC 时间。

我更改了您代码中的最后一行并添加了 .tz_convert(None)

In[1]:
from arctic import Arctic, TICK_STORE
from datetime import datetime as dt
import pandas as pd

from arctic.date._mktz import mktz


db = Arctic('localhost')
db.delete_library('temp')
db.initialize_library('temp', lib_type=TICK_STORE)
tickstore_lib = db['temp']

data = [{'A': 120, 'D': 1}, {'A': 122, 'B': 2.0}, {'A': 3, 'B': 3.0, 'D': 1}]
tick_index = [dt(2013, 6, 1, 12, 00, tzinfo=mktz('UTC')),
              dt(2013, 6, 1, 11, 00, tzinfo=mktz('UTC')),  # Out-of-order
              dt(2013, 6, 1, 13, 00, tzinfo=mktz('UTC'))]

data = pd.DataFrame(data, index=tick_index)

tickstore_lib._chunk_size = 3
tickstore_lib.write('SYM', data)
print(tickstore_lib.read('SYM', columns=None).index.tz_convert(None))
Out[1]:
NB treating all values as 'exists' - no longer sparse
TimeSeries data is out of order, sorting!
DatetimeIndex(['2013-06-01 11:00:00', '2013-06-01 12:00:00',
               '2013-06-01 13:00:00'],
              dtype='datetime64[ns]', freq=None)

我在此 post 中找到了解决方案和非常好的详细解释。