python с пандами для анализа дат типа «0001-11-29 13:00:00 до н. э.»

#python #python-3.x #pandas #python-datetime

Вопрос:

Я пытаюсь прочитать некоторые данные sql с помощью библиотеки pandas, и в одном из столбцов «customer_date» есть значения типа «0001-11-29 13:00:00 до н. э.». Мой запрос завершается ошибкой

Ошибка значения: год 0 выходит за пределы диапазона

Пожалуйста, предложите способ анализа таких меток даты/времени.

Вот мой код.

 import pandas as pd
from datetime import datetime, timedelta

session = ah.get_boto_session()
db = get_connection() **### Custom method**

pd.set_option('display.max_rows', None)
query = "SELECT customer_date FROM customer"
df = pd.read_sql(query, db, parse_dates=["customer_date"])
print(df.head())

db.dispose()
 

Ошибка:

 ---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-2-d4e334c3f39c> in <module>()
 22 pd.set_option('display.max_rows', None)
 23 query = "SELECT customer_date FROM customer"
---> 24 df = pd.read_sql(query, db, parse_dates=["customer_date"])
 25 print(df.head())

ValueError: year 0 is out of range
 

Комментарии:

1. Вы пробовали pd.read_sql(query, db, parse_dates={"customer_date": {"errors": "ignore"}}) ?

2. да, тоже пробовал. та же ошибка.

3. Что такое 0001 ? Это значение года ? Можете ли вы добавить еще пару примеров значений дат. Есть 0001 ли во всех значениях даты, которые у вас есть?

4. а как насчет использования вашего пользовательского формата, например parse_dates={"customer_date": {"format": .... , или просто как есть, без parse_dates параметра, а затем преобразовать его самостоятельно?

5. можете ли вы сделать что-то подобное select case when customer >= '1970-01-01' then customer else '1970-01-01 end from customer ? чтобы как бы понизить этот столбец

Ответ №1:

Вы не сможете прочитать эту дату в библиотеке pandas datetime, если попробуете pd.to_datetime(«0001-11-29 13:00:00»), панды создадут исключение за пределами границ

вы должны использовать терку для фиников более 1676

Возможно, вам нужно заменить год в вашем sql-операторе

Комментарии:

1. можете ли вы сказать, что вы имеете в виду?

Ответ №2:

Вот что сработало:

 import pandas as pd
from datetime import datetime, timedelta

session = ah.get_boto_session()
db = get_connection() **### Custom method**

pd.set_option('display.max_rows', None)
query = "SELECT case when customer_date >= '1970-01-01' then customer_date else '1970-01-01' end AS customer_date FROM customer"
df = pd.read_sql(query, db)
print(df.head())

db.dispose()