Обновлено: Извините, ребята, исправил код и добавил больше примеров.
Пытаюсь отформатировать даты из файла xlsx, но ничего не происходит. Вот мой код:
НЕОБРАБОТАННЫЕ ДАННЫЕ:
import pandas as pd
import numpy as np
import datetime as dt
df = pd.read_excel("Open_PO.xlsx")
df['Need By Date - Atual'].values
Выход исходных данных:
array(['2020-05-22T00:00:00.000000000', '2020-06-03T00:00:00.000000000',
'2020-06-03T00:00:00.000000000', ...,
'2022-10-28T00:00:00.000000000', '2022-10-28T00:00:00.000000000',
'2022-12-22T00:00:00.000000000'], dtype='datetime64[ns]')
ПОПЫТКА ФОРМАТИРОВАНИЯ:
df['Need By Date - Atual'] = pd.to_datetime(df["Need By Date - Atual"],format = '%d-%b-%y').dt.date
df['Need By Date - Atual'].values
ВЫХОД:
array([datetime.date(2020, 5, 22), datetime.date(2020, 6, 3),
datetime.date(2020, 6, 3), ..., datetime.date(2022, 10, 28),
datetime.date(2022, 10, 28), datetime.date(2022, 12, 22)],
dtype=object)
Как видите, параметр формата не работает.
Уже пытались добавить функцию dayfirst=True, astype и почти все, что люди публиковали в других вопросах.
Не могу использовать дату в формате str, потому что это портит функцию sort_values, которую я использую позже в коде.
Что я могу сделать??
df['Need By Date - Atual']
уже имеет дату и время dtype, не нужно вызывать pd.to_datetime
. Если вы, например, хотите привести к строке, вы можете сделать это с помощью df['Need By Date - Atual'].dt.strftime('%d-%b-%y')
format
используется только в том случае, если тип является str
, поскольку вы конвертируете из datetime64[ns]
, он не учитывает это.
@AmyChodorowski, если быть точным: в этом контексте format
является аргументом ключевого слова pd.to_datetime
, который указывает директиву strptime. Вы правы, что это нужно только в том случае, если ввод имеет строку типа данных (а не дату и время). Но поскольку dtype уже является datetime, это не так; скорее не применимо.
Эта строка уже сделала именно то, что вы хотели:
df['Need By Date - Atual'] = pd.to_datetime(df["Need By Date - Atual"],format = '%d-%b-%y').dt.date
# -> type pandas.Series
Но эта строка показывает вам массив numpy из вашей серии pandas:
df['Need By Date - Atual'].values
# -> type numpy.ndarray
Поскольку ряды и форматированные даты и время специфичны для панд, значения будут преобразованы в обычные даты и времени, известные numpy.
Вероятно, это то, чего вы хотели достичь:
pd.to_datetime(dd[0]).dt.strftime("%d/%m/%Y").values
На этот раз (без каламбура) визуальный формат будет применяться как строки, а не как дата и время.
Вероятно, вы захотите использовать аргумент date_format
из pandas.ExcelWriter:
with ExcelWriter('path_to_file.xlsx', date_format='DD-MM-YY') as writer:
df.to_excel(writer, sheet_name='some_date_sheet')
Источник: документация ExcelWriter pandas
Блин, не знал, спасибо! Проблема в том, что когда я использую средство записи xlsx для создания файла xlsx с использованием чистого фрейма данных, вывод даты такой же, как и в массиве numpy. Могу ли я что-нибудь сделать, чтобы отформатировать его правильно?
разработайте минимальный рабочий пример того, что вы хотите сделать в 2 строки.