Python 用null替换字符串的一部分

Python 用null替换字符串的一部分,python,pandas,string,psycopg2,Python,Pandas,String,Psycopg2,我需要使用Python将Excel文件自动导入PostgreSQL。我对Python比较陌生,但我成功地自动化了表的创建。现在我无法将数据导入表中。 我遇到的问题是,在PostgreSQL中,我将某些列定义为日期列。然而,对于许多“日期”列,还没有任何数据。因此它被标记为nan。但是,psycopg2不喜欢nan作为日期列的值,而是希望为null。 当将列表转换为字符串时,应该将其传递到插入到{sheet}值({formatted_data_string}),我认为表的各个条目应该是这样的字符串

我需要使用Python将Excel文件自动导入PostgreSQL。我对Python比较陌生,但我成功地自动化了表的创建。现在我无法将数据导入表中。

我遇到的问题是,在PostgreSQL中,我将某些列定义为日期列。然而,对于许多“日期”列,还没有任何数据。因此它被标记为nan。但是,psycopg2不喜欢nan作为日期列的值,而是希望为null。

当将列表转换为字符串时,应该将其传递到
插入到{sheet}值({formatted_data_string})
,我认为表的各个条目应该是这样的字符串:
'data','data','data',null,“data”
下面的代码从Excel文件中获取数据,然后创建应插入SQL语句的格式化数据字符串

 def import_data(path):
    xl = pd.ExcelFile(path)
    sheets = xl.sheet_names
    conn = psycopg2.connect(host=host, port=port, database=database, user=user, password=password)
    cur = conn.cursor()
    sheet_column_names = []
    for sheet in sheets:
        if sheet == 'ReadMe':
            continue

        df = pd.read_excel(xl, sheet)
        list_of_rows = df.to_numpy().tolist()
        for entry in list_of_rows:
            if entry == list_of_rows[0]:
                continue

            formatted_data = []
            for element in entry:
                if element == 'nan':
                    formatted_data.append('null')
                else:
                    formatted_data.append(f"'{element}'")
            formatted_data_str = ','.join(str(element) for element in formatted_data)
            print(formatted_data_str)
几乎所有数据的格式都正确,除了“nan”值,它仍然显示为“nan”,而不是我期望的
null
。我检查了几次代码,但都不明白为什么它不能用null替换nan。

这是我目前从以下代码中获得的格式化数据的示例:
'25…1','Something','XX','XX','relToChild,relToParent','Some Other Data','2018-10-09 06:04:28.015000','nan','1','DISABLED','nan',…


这个代码有问题吗。或者我遗漏了一些明显的东西,可以用不带引号的空值替换吗?

因此我找到了解决问题的方法,效果很好。 使用以下命令创建第二个数据帧会将所有nan替换为None

df = pd.read_excel(xl, sheet)
df1 = df.where(pd.notnull(df), None)
然后,这允许我使用For循环将None作为目标,将所有None替换为null。在数据对象周围添加第二个单引号

for element in entry:
   if element != None:
      formatted_data.append(f"'{element}'")
      continue
   else:
      formatted_data.append('null')
使用将新列表(格式化的_数据)转换为字符串后

formatted_data_str = ','.join(str(element) for element in formatted_data)
生成的字符串是我在上面解释的所需格式。服务器接受SQL语句,并且PostgreSQL数据库中的数据似乎是正确的。我知道这可能不是最好的解决方案,但它对我有效,这就是我现在所需要的