#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()