将日期时间从 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
我有一个 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