Форматирование даты в MM/DD/YYY из файла xlsb

У меня есть файл .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 конкретное решение? Я уверен, что вы могли бы сделать это с помощью модуля datetime, если нет

Reedinationer 28.03.2019 00:17

Каков ожидаемый результат здесь? Ваш заголовок и содержание вопроса не совсем совпадают.

roganjosh 28.03.2019 00:25

Возможный дубликат Преобразование числа в дату с использованием Pandas в Python?

roganjosh 28.03.2019 00:42

Это обман спекулятивный, потому что я не уверен, что точные форматы даты переводятся между библиотеками (превращая числовой ввод в формат даты)

roganjosh 28.03.2019 00:42

Ваш заголовок говорит "ММ/ДД/ГГГ". Вам ведь не нужен трехзначный год, не так ли? (Если ваши требования позволяют это, рассмотрите возможность использования формата ISO-8601 «ГГГГ-ММ-ДД». xkcd.com/1179)

Keith Thompson 28.03.2019 00:51

Извините, это должно быть ММ/ДД/ГГГГ (опечатка)

JollyKinG 28.03.2019 01:01
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
6
1 879
2

Ответы 2

Предположим, что ваш столбец даты - «Дата», команда будет примерно такой:

dataset['Date'] = pd.to_datetime(dataset['Date'], format='%m/%d/%Y')

Это делает только половину работы. Теперь у вас есть объект datetime, а не форматированная строка.

roganjosh 28.03.2019 00:21

Ну собственно вопрос не ясен. Название читается так, как будто они хотят строку в конце от strftime в основном

roganjosh 28.03.2019 00:23

Я не видел, чтобы ОП говорил, что хочет строку. Он говорит, что ему нужны даты в формате ММ/ДД/ГГГГ.

accdias 28.03.2019 00:23

Это подразумевается в названии, но я попросил разъяснений.

roganjosh 28.03.2019 00:25

На вашу правку: и вывод вашего ответа не был бы таким выводом. Аргумент format для to_datetime должен сообщить pandas, как анализировать вне строки и объект datetime. Он не будет печатать или записывать обратно в указанном формате, если вы оставите его только на этом шаге.

roganjosh 28.03.2019 00:27

Нет. Он отформатирует столбец datetime, используя format. Я делаю это все время здесь.

accdias 28.03.2019 00:29

Вернемся к своему ПК вместо телефона, чтобы я мог лучше видеть. Я думаю, что мы оба сбились с курса; похоже на Эта проблема

roganjosh 28.03.2019 00:43

Я согласен. Книга, вероятно, использует другой формат, и столбцы еще не были преобразованы в объект datetime.

accdias 28.03.2019 00:45

Просто для дальнейшего разъяснения здесь, Роганджош прав. Как объясняет ОП, он получает порядковые номера из дат Excel (что происходит при вводе файлов xlsb). Использование порядкового номера 41256 (на который ссылались) в pd.to_datetime() не дало бы желаемого результата.

kowpow 19.11.2021 13:52

У меня была похожая проблема, которую я смог решить благодаря этот ответ.

Попробуйте функцию 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)

Кредиты

Другие вопросы по теме