将日期时间从 csv 插入到 postgres 错误

insert datetime from csv to postgres error

我有一个 csv 文件:

with open(r'apps/patients/management/commands/events.csv') as csvfile:
        spamreader = csv.DictReader(csvfile, delimiter=',' ,quotechar=' ')
        for row in spamreader:
            print(row)

输出:

{'PATIENT ID': '2', 'PATIENT NAME': 'John', 'EVENT TYPE': 'HR', 'EVENT VALUE': '118', 'EVENT UNIT': 'beats/minute', 'EVENT TIME': '2021-07-09T00:05:00Z'}
{'PATIENT ID': '2', 'PATIENT NAME': 'John', 'EVENT TYPE': 'RR', 'EVENT VALUE': '9', 'EVENT UNIT': 'breaths/minute', 'EVENT TIME': '2021-07-09T00:05:00Z'}

然后我尝试将文件数据插入 postgres 数据库:

with open(r'apps/patients/management/commands/events.csv') as csvfile:
        spamreader = csv.DictReader(csvfile, delimiter=',' ,quotechar=' ')
        for row in spamreader:
            cur.execute(f"""INSERT INTO patients_event (patient_id, event_type_id , event_value ,event_unit, event_time) VALUES
                  ({row['PATIENT ID']},{row['EVENT TYPE']},{row['EVENT VALUE']},
                   {row['EVENT UNIT']},{row['EVENT TIME']})""")
conn.commit()

错误:

psycopg2.errors.SyntaxError: syntax error at or near "T02"
LINE 3:                    beats/minute,2021-07-07T02:27:00Z)

它适用于 psql 客户端。

INSERT INTO patients_event (patient_id, event_type_id , event_value ,event_unit, event_time) VALUES ('1','Jane','HR','82','beats/minute','2021-07-07T02:27:00Z')

我以为是字符串字符'T02'的问题,所以我用:

row['EVENT TIME'].replace('T',' ')

然后错误就变成了:

psycopg2.errors.SyntaxError: syntax error at or near "02"
LINE 3:                    beats/minute,2021-07-07 02:27:00Z)
                                                   ^

然后我想我需要先将它转换为日期时间:

{datetime.strptime(row['EVENT TIME'], '%Y-%m-%dT%H:%M:%SZ')}

与上一个错误相同。

然后我做了一些研究:

{row['EVENT TIME']::timestamp}

错误:

ValueError: Invalid format specifier

卡在这里2天了,有哪位朋友可以帮忙吗?

更新: 将工作的 psql 客户端输入与第 3 行错误进行比较,您在 cur.execute() 语句中的各个值周围缺少单引号。

原答案: (重点在问题后面的.Replace('T')问题)

2021-07-07T02:27:00Z 采用 ISO 8601 UTC 格式。它包括日期、时间和时区偏移量。显然,您的 table 的 event_time 列是时间戳格式,只有日期和时间。

您需要将带时区的传入日期转换为本地时区格式以省略时区。

看起来您在将数据转换为 ::timestamp 的正确轨道上,但它不会丢弃时区信息,它希望您进行适当的转换。

我相信这个 Whosebug 答案很好地解释了转换:PostgreSQL wrong converting from timestamp without time zone to timestamp with time zone