Импортировать Excel в Pandas Dataframe, но сохранить порядок дня и месяца в датах?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Импортировать Excel в Pandas Dataframe, но сохранить порядок дня и месяца в датах?

Сообщение Anonymous »

Инженер данных здесь, просто загружает файлы 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»