Инженер данных здесь, просто загружает файлы Excel xlsx в таблицу базы данных SQL Server. Проблема в том, что человек, создающий файлы Excel, вводит даты в формате дд/мм/гггг (европейский формат). Если день > 12, результирующий файл xlsx читает дату как текст (например, 31.03.2024). Но если день равен 12 или меньше, xlsx считывает дату как дату (например, 04.06.2024 выглядит как 4 июня, но на самом деле это 6 апреля). Кажется, Pandas уважает этот выбор типа данных при загрузке файла в DataFrame с помощью pd.read_excel(). Это означает, что две вышеуказанные даты окажутся в таблице базы данных как «2024-03-31» (правильно) и «2024-06-04» (неправильно).
Как мне получить эти файлы Excel в таблицу, но каждый раз правильно анализировать дату? У меня нет контроля над файлами Excel до того, как они будут сохранены и помещены в целевую папку.
Рабочее решение
Спасибо @ Темунель, чье решение почти работает. Я изменил его, используя следующую идею: существует ли Python-эквивалент DateTime.TryParse() в C#?
Настоящая проблема заключается в том, что Excel сохраняет как дату (т. е. первое значение < 13), то Pandas считывает его как дату, а затем преобразует в строку, а не в целое число даты Excel — в итоге получается «гггг-мм-дд ЧЧ:ММ:СС». Если он не распознает дату (т. е. первое значение > 12), Pandas просто читает ее как строку — в конечном итоге она выглядит как «дд/мм/гггг».
from datetime import datetime, timedelta
DATE_PATTERNS = ["%Y-%d-%m %H:%M:%S", "%d/%m/%Y"]
def excel_date_parser(val):
""" Parse Excel serial dates and text dates in dd/mm/yyyy format. """
# Check if it's a float or an int (Excel serial date)
if isinstance(val, float) or isinstance(val, int):
# Convert Excel date serial to datetime
return datetime(1899, 12, 30) + timedelta(days=val)
else:
# Try parsing as text in one of the formats from DATE_PATTERNS list above
try:
return try_to_datetime(val)
except Exception as e:
print(f"Error parsing {val}: {e}")
return None
def try_to_datetime(val):
for fmt in DATE_PATTERNS:
try:
return pd.to_datetime(val, format=fmt, errors='raise')
except:
continue
raise ValueError
df = pd.read_excel("file_with_Euro_dates.xlsx", dtype={"Date": str})
df["Date"] = df["Date"].apply(excel_date_parser)
df
Подробнее здесь: https://stackoverflow.com/questions/790 ... h-in-dates
Импортировать Excel в Pandas Dataframe, но сохранить порядок дня и месяца в датах? ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Импортировать Excel в Pandas Dataframe, но сохранить порядок дня и месяца в датах?
Anonymous » » в форуме Python - 0 Ответы
- 19 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Импортировать Excel в Pandas Dataframe, но сохранить порядок дня и месяца в датах?
Anonymous » » в форуме Python - 0 Ответы
- 19 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Импортировать Excel в Pandas Dataframe, но сохранить порядок дня и месяца в датах?
Anonymous » » в форуме Python - 0 Ответы
- 12 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Импортировать Excel в Pandas Dataframe, но сохранить порядок дня и месяца в датах?
Anonymous » » в форуме Python - 0 Ответы
- 18 Просмотры
-
Последнее сообщение Anonymous
-