我有一个像这样的数据帧,带有以UTC秒为单位的时间戳
open high low close volumeto
time
1530169200 6112.81 6120.62 6108.65 6111.63 2212255.01
1530170100 6111.63 6119.12 6106.45 6113.59 1572299.36
1530171000 6113.59 6116.44 6104.34 6110.23 2792660.45
1530171900 6110.23 6123.71 6106.49 6123.71 2314140.04
1530172800 6121.33 6133.24 6121.18 6129.52 2037071.96
当我尝试将其写入csv时,这就是我得到的,我猜pandas假设提供的时间是本地时间,并且将其偏移5小时30分钟,但是我提供了UTC时间
1530149400,6112.81,6120.62,6108.65,6111.63,2212255.01:
1530150300,6111.63,6119.12,6106.45,6113.59,1572299.36:
1530151200,6113.59,6116.44,6104.34,6110.23,2792660.45:
1530152100,6110.23,6123.71,6106.49,6123.71,2314140.04:
1530153000,6121.33,6133.24,6121.18,6129.52,2037071.96:
我的代码如下所示
csv_string = io.StringIO()
df.to_csv(csv_string, line_terminator=':', header=False, date_format='%s')
print(csv_string.getvalue())
如何告诉熊猫我已经提供了UTC时间,并且不想在转换时抵消它?
答案 0 :(得分:1)
执行此操作的一种方法是首先使用tz_localize()
使时间列成为时区感知的。在您的情况下,假设您的DataFrame被称为df
:
df.index = df.index.tz_localize(tz='UTC')
现在,该索引可识别时区。但是,我不确定这是否是时间不同的原因。
编辑
如果索引已经附加了tz,则可以像添加时区一样更改它,但是现在使用tz_convert
来更改,如错误所示。代码将变为:
df.index = df.index.tz_convert(tz='UTC')
但是,这也会更改时间。为了用时区UTC替换时区,您需要执行以下操作:
import pytz
df.index = [t.replace(tzinfo=pytz.utc) for t in df.index]
但是,在执行此操作之前,最好先检查时区是什么,看看是否与5:30时差相对应。此外,还应意识到使用date_format='%s'
会忽略时区信息,并且通常采用系统的时区。有关更多信息,请参见以下接受的答案:
Python - Setting a datetime in a specific timezone (without UTC conversions)
顺便说一句,如果我只是将您的DataFrame复制粘贴到我的机器上并写成to_csv
,它就可以按预期工作。