pandas DataFrame插入InfluxDB 2.0时导入CSV/Pickle数据写入失败咨询
问题根因与解决方法
第一个错误:索引设置未生效
pandas的set_index方法默认返回新的DataFrame实例,不会修改原对象。你写的_data_frame.set_index('Time')没有对原DataFrame做任何修改,写入时依然是用默认的整数索引,InfluxDB无法识别有效时间戳,因此写入失败。
第二个错误:时间格式不符合要求
InfluxDB 2.0要求写入的时间索引必须是时区感知的datetime类型,不能是字符串格式,也不能是不带时区信息的 naive datetime。你导入的文件中Time列是字符串格式的"2020-01-01 01:00:00",必须做格式调整。
调整后的可运行代码
import pandas as pd from datetime import timezone # 读取pickle文件 _data_frame = pandas.read_pickle("sample.pickle") # 1. 将Time列转换为带UTC时区的datetime类型 # 若原始时间为其他时区,将timezone.utc替换为对应时区即可,比如东八区用'Asia/Shanghai' _data_frame['Time'] = pd.to_datetime(_data_frame['Time']).dt.tz_localize(timezone.utc) # 2. 正确设置时间索引,两种写法二选一即可 # 写法1:重新赋值给原变量 _data_frame = _data_frame.set_index('Time') # 写法2:加inplace=True直接修改原对象 # _data_frame.set_index('Time', inplace=True) # 执行写入操作 _write_client.write("my-bucket", "my-org", record=_data_frame, data_frame_measurement_name='sample-data', data_frame_tag_columns=['sample'])
验证方法
写入前可以执行print(_data_frame.index)确认索引格式,正常输出应为DatetimeIndex(['2020-01-01 01:00:00+00:00', ...], dtype='datetime64[ns, UTC]', name='Time')格式即可。
内容的提问来源于stack exchange,提问作者T2020
相关产品推荐
相关产品推荐

