#python-3.x #pandas #postgresql
Вопрос:
У меня есть база данных PostgreSQL 11, которая по какой-то причине содержит некоторые записи, такие как:
database=> SELECT id, date_one, date_two, date_three FROM mytable WHERE id = 1337;
id | date_one | date_two | date_three
-------- ------------ --------------- ---------------
1337 | 1934-06-24 | 0001-01-01 BC | 0001-01-01 BC
(1 row)
И когда я пытаюсь извлечь эти записи, я получаю ошибку:
import pandas as pd
df = pd.read_sql('select id, date_one, date_two, date_three from mytable where id = 1337;',
connector_DB()
)
доходность:
Traceback (most recent call last):
File "<ipython-input-72-08b82cbc2885>", line 1, in <module>
df = pd.read_sql('select id, date_one, date_two, date_three from mytable where id = 1337;', connector_DB())
File "/usr/local/lib/python3.6/dist-packages/pandas/io/sql.py", line 489, in read_sql
chunksize=chunksize,
File "/usr/local/lib/python3.6/dist-packages/pandas/io/sql.py", line 1740, in read_query
data = self._fetchall_as_list(cursor)
File "/usr/local/lib/python3.6/dist-packages/pandas/io/sql.py", line 1753, in _fetchall_as_list
result = cur.fetchall()
ValueError: year 0 is out of range
Может ли кто-нибудь любезно объяснить мне, что именно там не так? Потому что я обнаружил (много) людей, говорящих об этой ошибке, когда дата 0000-00-00 или что-то подобное, но моя дата на самом деле является действительной датой, не так ли? Так что я ничего не понимаю. И как я мог избежать этой ошибки?
Моя версия для Панд — «1.1.4» и Python 3.6.9 (по умолчанию, январь 26 2021, 15:33:00).
Комментарии:
1. Я столкнулся с этой ошибкой на прошлой неделе. Является ли дата в вашем постгресе на самом деле 0-0-1 до н. э.? или это какая-то другая дата, которая просто была неправильно истолкована postgres? Если это последнее, вы должны иметь возможность использовать strftime в postgres и позволить пандам интерпретировать дату и время
2. Что ж, дата на самом деле появляется точно так, как показано в результатах sql-запроса, отображаемых в первой таблице операции. Могу ли я еще что-нибудь сделать, чтобы распечатать более подробную информацию? И pgAdmin говорит мне, что формат всех этих колумов прост
date
.3. Попробуйте использовать
to_char(...)
, чтобы превратить дату в какую-то строку , которую вы позже сможете разобрать в панд4. Хм, нет:
No function matches the given name and argument types. You might need to add explicit type casts.
5.
select to_char('0001-01-01 BC' :: date, 'YYYY-MM-DD')
дает мне0001-01-01
в качестве текста. Что я упускаю?