我正在尝试使用 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。
答案 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 中找到了解决方案和非常好的详细解释。