我正在使用pandas创建一个python脚本来读取一个具有多个行值的文件。
读取后,我需要构建一个包含这些值的数组,然后将其赋给一个行值。
我使用的代码是
import re
import numpy as np
import pandas as pd
master_data = pd.DataFrame()
temp_df = pd.DataFrame()
new_df = pd.DataFrame()
for f in data:
##Reading the file in pandas which is in excel format
#
file_df = pd.read_excel(f)
filename = file_df['Unnamed: 1'][2]
##Skipping first 24 rows to get the required reading values
column_names = ['start_time','xxx_value']
data_df = pd.read_excel(f, names=column_names, skiprows=25)
array =np.array([])
for i in data_df.iterrows():
array = np.append(array,i[1][1])
temp_df['xxx_value'] = [array]
temp_df['Filename'] = filename
temp_df['sub_id']=
temp_df['Filename'].str.split('_',1).str[1].str.strip()
temp_df['sen_site']=
temp_df['Filename'].str.split('_',1).str[0].str.strip()
temp_df['sampling_interval'] = 15
temp_df['start_time'] = data_df['start_time'][2]
new_df= new_df.append(xxx_df)
new_df.index = new_df.index + 1
new_df=new_df.sort_index()
new_df.index.name='record_id'
new_df = new_df.drop("Filename",1) ##dropping the Filename as it
is not needed to be loaded in postgresql
##Rearrange to postgresql format
column_new_df = new_df.columns.tolist()
column_new_df.
insert(4,column_new_df.pop(column_new_df.index('xxx_value')))
new_df = new_df.reindex(columns = column_new_df)
print(new_df)
字符串
当我尝试将数组数据插入到Postgresql中时,这段代码不起作用。
它给了我一个错误,说明:
ProgrammingError:(psycopg2.ProgrammingError)无法适应类型'numpy.ndarray'
5条答案
按热度按时间3mpgtkmj1#
在我看来,最有效的方法是让psycopg 2总是知道np.ndarray(s)。可以通过注册一个适配器来做到这一点:
字符串
为了帮助使用numpy,我对依赖于psycopg 2的脚本/库的默认插件是:
型
否则即使是数字类型也会有一些问题。
我从这个其他stackoverflow entry得到了适配器技巧。
vohkndzv2#
我不知道问题出在哪里,因为我在你的代码中看不到你将数据插入Postgres的部分。
我的猜测是你给了Postgres一个Numpy数组:psycopg2不能处理Numpy数据类型,但它应该很容易将其转换为与psycopg2一起工作的原生Python类型(例如,通过使用.tolist(方法),如果没有代码,很难给予更精确的信息)。
2admgd593#
首先使用
apply
和tolist
将每个numpy数组元素转换为其等效列表,然后您应该能够将数据写入Postgres:字符串
093gszye4#
我们可以通过一次提取一个元素来解决这个问题。这里我假设对于
numpy.int64
类型的temp_df
,sub_id
,我们可以直接使用iloc
和item作为temp_df.iloc[0]['sub_id'].item()
提取值,然后我们可以将其推送到DB中。xhv8bpkk5#
字符串
您需要导入register_vector,以便它可以与numpy数组一起工作。如果您正在使用PostgreSQL的PG Vector插件,则也需要这样做。