繁体   English   中英

将日期时间从 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 格式。 它包括日期、时间和时区偏移量。 显然,您表的 event_time 列是仅包含日期和时间的时间戳格式。

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

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

我相信这个 StackOverflow 答案很好地解释了转换: PostgreSQL 错误从没有时区的时间戳转换为有时区的时间戳

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM