首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ProgrammingError:(心理学2.ProgrammingError)不能适应'numpy.ndarray‘类型

ProgrammingError:(心理学2.ProgrammingError)不能适应'numpy.ndarray‘类型
EN

Stack Overflow用户
提问于 2016-09-19 03:02:37
回答 4查看 13.1K关注 0票数 10

我正在使用熊猫创建一个python脚本来读取具有多行值的文件。

读取后,我需要构建这些值的数组,然后将其分配给dataframe行值。

我使用的代码是

代码语言:javascript
复制
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:(心理学2.ProgrammingError)不能适应'numpy.ndarray‘类型

EN

回答 4

Stack Overflow用户

发布于 2017-04-05 08:54:51

我不知道问题出在哪里,因为我在您的代码中看不到将数据插入Postgres的部分。

不过,我猜您给Postgres提供了一个Numpy数组: psycopg2不能处理Numpy数据类型,但是应该很容易将其转换为与psycopg2一起工作的原生.tolist类型(例如,通过使用.tolist(方法),很难在没有代码的情况下提供更精确的信息)。

票数 2
EN

Stack Overflow用户

发布于 2020-04-13 07:34:30

在我看来,最有效的方法是让psycopg2始终了解np.ndarray。可以通过注册适配器来做到这一点:

代码语言:javascript
复制
import numpy as np
from psycopg2.extensions import register_adapter, AsIs

def addapt_numpy_array(numpy_array):
    return AsIs(tuple(numpy_array))

register_adapter(np.ndarray, addapt_numpy_array)

通常,为了帮助处理numpy,我对依赖于psycopg2的脚本/库的默认注释是:

代码语言:javascript
复制
import numpy as np
from psycopg2.extensions import register_adapter, AsIs

def addapt_numpy_float64(numpy_float64):
    return AsIs(numpy_float64)

def addapt_numpy_int64(numpy_int64):
    return AsIs(numpy_int64)

def addapt_numpy_float32(numpy_float32):
    return AsIs(numpy_float32)

def addapt_numpy_int32(numpy_int32):
    return AsIs(numpy_int32)

def addapt_numpy_array(numpy_array):
    return AsIs(tuple(numpy_array))

register_adapter(np.float64, addapt_numpy_float64)
register_adapter(np.int64, addapt_numpy_int64)
register_adapter(np.float32, addapt_numpy_float32)
register_adapter(np.int32, addapt_numpy_int32)
register_adapter(np.ndarray, addapt_numpy_array)

否则,即使是数值类型,也会出现一些问题。

我从另一个stackoverflow entry获得了适配器技巧。

票数 2
EN

Stack Overflow用户

发布于 2020-03-25 13:50:37

首先使用applytolist将每个numpy数组元素转换为其等效列表,然后您应该能够将数据写入Postgres:

代码语言:javascript
复制
df['column_name'] = df['column_name'].apply(lambda x: x.tolist())
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39564755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档