У меня есть файл .xlsb, который я хочу использовать в пандах и анализировать. Я нашел, как использовать pyxlsb, чтобы открыть файл и создать другой набор данных. Однако теперь проблема заключается в том, что форматы времени изменились на другой числовой формат (например, 41256).
Код, который я использую на данный момент:
dataset = []
with open_xlsb(file) as wb: #opening an xlsb file workbook
with wb.get_sheet(1) as sheet1:
for row in sheet1.rows():
dataset.append([item.v for item in row])
dataset= pd.DataFrame(dataset[1:], columns=dataset[0])
Я уже пробовал convert_date следующим образом:
convert_date(dataset)
Я также пробовал функцию to_datetime, но не уверен, правильно ли я ее использовал. Для справки, набор данных, который я использую, имеет даты в нескольких столбцах и строках, поэтому я ищу способ преобразовать их все в правильный формат, игнорируя при этом любые ошибки.
Обновлено: поэтому у меня нет ни одного столбца с «Датой», скорее у меня есть несколько столбцов, таких как StartDate, EndDate, Last Updated и некоторые другие. Результат, который я хочу увидеть, заключается в том, что если я перейду к столбцу, например dataset.columns['StartDate'], я хочу получить значение даты, например 15/03/2019, а не 42156.
Любая помощь приветствуется!
Каков ожидаемый результат здесь? Ваш заголовок и содержание вопроса не совсем совпадают.
Возможный дубликат Преобразование числа в дату с использованием Pandas в Python?
Это обман спекулятивный, потому что я не уверен, что точные форматы даты переводятся между библиотеками (превращая числовой ввод в формат даты)
Ваш заголовок говорит "ММ/ДД/ГГГ". Вам ведь не нужен трехзначный год, не так ли? (Если ваши требования позволяют это, рассмотрите возможность использования формата ISO-8601 «ГГГГ-ММ-ДД». xkcd.com/1179)
Извините, это должно быть ММ/ДД/ГГГГ (опечатка)






Предположим, что ваш столбец даты - «Дата», команда будет примерно такой:
dataset['Date'] = pd.to_datetime(dataset['Date'], format='%m/%d/%Y')
Это делает только половину работы. Теперь у вас есть объект datetime, а не форматированная строка.
Ну собственно вопрос не ясен. Название читается так, как будто они хотят строку в конце от strftime в основном
Я не видел, чтобы ОП говорил, что хочет строку. Он говорит, что ему нужны даты в формате ММ/ДД/ГГГГ.
Это подразумевается в названии, но я попросил разъяснений.
На вашу правку: и вывод вашего ответа не был бы таким выводом. Аргумент format для to_datetime должен сообщить pandas, как анализировать вне строки и объект datetime. Он не будет печатать или записывать обратно в указанном формате, если вы оставите его только на этом шаге.
Нет. Он отформатирует столбец datetime, используя format. Я делаю это все время здесь.
Вернемся к своему ПК вместо телефона, чтобы я мог лучше видеть. Я думаю, что мы оба сбились с курса; похоже на Эта проблема
Я согласен. Книга, вероятно, использует другой формат, и столбцы еще не были преобразованы в объект datetime.
Просто для дальнейшего разъяснения здесь, Роганджош прав. Как объясняет ОП, он получает порядковые номера из дат Excel (что происходит при вводе файлов xlsb). Использование порядкового номера 41256 (на который ссылались) в pd.to_datetime() не дало бы желаемого результата.
У меня была похожая проблема, которую я смог решить благодаря этот ответ.
Попробуйте функцию datetime.fromordinal из модуля datetime следующим образом:
from datetime import datetime
# for integers
def convert_int_date(ordinal_date):
date_time = datetime.fromordinal(
datetime(1900, 1, 1).toordinal() + ordinal_date - 2
)
return date_time
dataset["StartDate"] = dataset["StartDate"].astype(int).apply(convert_int_date)
Затем вы можете отформатировать дату по своему усмотрению.
dataset["StartDate"] = dataset["StartDate"].dt.strftime("%m/%d/%Y")
В моем конкретном случае каждая дата была задана целым числом. Часы, минуты и секунды не учитывались. Если вам нужно принять их во внимание (или если у вас есть плавающее число в качестве даты), попробуйте следующее:
# for floats
def convert_float_date(ordinal_date):
hours, r = divmod(ordinal_date, 1)
minutes, r = divmod(r*60, 1)
seconds = r*60
date_time = datetime.fromordinal(
datetime(1900, 1, 1).toordinal() + ordinal_date - 2
)
datetime = date_time.replace(hour=hours, minute=minutes, second=seconds)
return date_time
dataset["StartDate"] = dataset["StartDate"].astype(float).apply(convert_float_date)
Вы ищете
pandasконкретное решение? Я уверен, что вы могли бы сделать это с помощью модуляdatetime, если нет