Не удалось получить записи Postgres с датой 0001-01-01 до н. э. с помощью Панд

#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 в качестве текста. Что я упускаю?