pd.ExcelWriter, добавить datetime, но получил: Неизвестный или неподдерживаемый тип datetime

Я создаю инструмент для импорта файла .txt и экспорта его как файла .xslx с помощью pd.ExcelWriter. Для импорта я использую pd.read_csv, который отлично работает. Экспорт фрейма данных в формате .xslx также отлично работает, за исключением того, что время не распознается Excel:

csv_file = pd.read_csv(ex_name,sep=';',skip_blank_lines=False,index_col=False,header=None,usecols=[0,1,2,3,4,5,6,7,8,9])

writer = pd.ExcelWriter('output.xlsx',
                        engine='xlsxwriter',
                        options={'strings_to_numbers': True},
                        datetime_format='yyyy-mm-dd hh:mm')
    
csv_file.to_excel(writer,sheet_name='Sheet1',index=False,header=False)
writer.save()

Поэтому я добавил несколько строк перед writer.save (), чтобы изменить формат:

workbook  = writer.book
worksheet = writer.sheets['Sheet1']
formatdict = {'num_format':'yyyy-mm-dd hh:mm'}
fmt = workbook.add_format(formatdict)

worksheet.write_datetime('C6:C{0}'.format(int(len(date_export)+5)),date_export),fmt)

Где csv_file - импортированный файл .txt, date_export - серия дат, которую я пытался перезаписать. Но у меня ошибка типа: Unknown or unsupported datetime type

Я также попытался добавить новый диапазон дат, созданный с помощью pd.date_range:

daterange = pd.date_range(start=date_export[0], periods=len(date_export),
                              freq='D', normalize=True)

С dtype='datetime64[ns], но у меня такая же ошибка.

Таким образом, экспорт с использованием pd.ExcelWriter работает (при использовании только первого блока кода), но Excel распознает, что datetime не работает из-за ошибки в консоли python.

ПОЛНАЯ ОШИБКА

Traceback (most recent call last):

  File "D:\txt_to_excel.py", line 399, in <module>
    worksheet.write_datetime('C6:C{0}'.format(int(len(daterange)+5)),daterange)#,fmt)

  File "C:\ProgramData\Anaconda3\lib\site-packages\xlsxwriter\worksheet.py", line 69, in cell_wrapper
    return method(self, *args, **kwargs)

  File "C:\ProgramData\Anaconda3\lib\site-packages\xlsxwriter\worksheet.py", line 770, in write_datetime
    return self._write_datetime(row, col, date, cell_format)

  File "C:\ProgramData\Anaconda3\lib\site-packages\xlsxwriter\worksheet.py", line 784, in _write_datetime
    number = self._convert_date_time(date)

  File "C:\ProgramData\Anaconda3\lib\site-packages\xlsxwriter\worksheet.py", line 3892, in _convert_date_time
    self.remove_timezone)

  File "C:\ProgramData\Anaconda3\lib\site-packages\xlsxwriter\utility.py", line 677, in datetime_to_excel_datetime
    raise TypeError("Unknown or unsupported datetime type")

TypeError: Unknown or unsupported datetime type

ВХОДНОЙ ФАЙЛ ДЛЯ ПЕРВЫХ 10 СТРОК

1;2;3;4;5;6;7;8;9;
LOCATION;FILTER NR;X COORD;Y COORD;SURFACE LEV (m-ref);TOP FILTER (m-ref);BOTTOM FILTER (m-ref);MEAS POINT LEV (m-ref);SED SUMP LENGTH (m);START DATE;
pb 1-1;1;1;1;1;1;1;;;2006-08-17 00:00:00

LOCATION;FILTER NR;DATE;VALUE (m-ref)
pb 1-1;1;2006-08-17 00:00:00;40.384
pb 1-1;1;2006-08-18 00:00:00;40.337
pb 1-1;1;2006-08-19 00:00:00;40.296
pb 1-1;1;2006-08-20 00:00:00;40.321
pb 1-1;1;2006-08-21 00:00:00;40.358000000000004

ЖЕЛАЕМЫЙ РЕЗУЛЬТАТ

Идеально, за исключением того, что дата и время не распознаются. введите описание изображения здесь


person Dylan_w    schedule 03.09.2020    source источник
comment
Не могли бы вы привести пример вашего входного текстового файла? Также укажите код, в котором вы используете pd.read_csv ().   -  person above_c_level    schedule 03.09.2020
comment
Также вы можете добавить ошибку полного типа, а не только сводку.   -  person jmcnamara    schedule 03.09.2020
comment
Спасибо за отзыв, я добавил информацию.   -  person Dylan_w    schedule 03.09.2020
comment
Показывает ли та же ошибка, если вы включите параметры parse_dates = [2], infer_datetime_format = True в pd.read_csv?   -  person above_c_level    schedule 03.09.2020


Ответы (1)


Я пробовал различные Pandas parse_dates и похожие варианты, но мне не удалось заставить их работать с форматом ваших входных данных. Возможно, кто-то другой это выяснит и опубликует рабочий пример.

В качестве альтернативы предлагается версия, которая расширяет стандартный метод Xlsxwriter worksheet.write() для преобразования строк, похожих на дату, в даты Excel на лету.

import pandas as pd
from datetime import datetime

ex_name = 'so63718752.txt'

csv_file = pd.read_csv(ex_name, sep=';', skip_blank_lines=False,
                       index_col=False, header=None,
                       usecols=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

writer = pd.ExcelWriter('output.xlsx',
                        engine='xlsxwriter',
                        options={'strings_to_numbers': True},
                        datetime_format='yyyy-mm-dd hh:mm')

csv_file.to_excel(writer, sheet_name='Sheet1', index=False, header=False)

# Get the xlsxwriter workbook and worksheet object used by Pandas.
workbook = writer.book
worksheet = writer.sheets['Sheet1']

# Make the date columns wider for clarity in this example.
worksheet.set_column(2, 2, 12, None)
worksheet.set_column(9, 9, 12, None)

# Create a date format to use in Excel.
date_format = workbook.add_format({'num_format': 'yyyy-mm-dd'})


# Create a function that changes the worksheet write() method so
# that strings are evaluated into dates or just handled normally.
def string_to_date(worksheet, row, col, cell, cell_format=None):
    try:
        # Try convert the cell string to a date.
        date_time = datetime.strptime(cell, '%Y-%m-%d %H:%M:%S')
        # If it works then write it as an Excel date.
        return worksheet.write_datetime(row, col, date_time, date_format)
    except:
        # If it doesn't work then return control to the calling write() method.
        return None

# Add the write() handler/callback to the worksheet.
worksheet.add_write_handler(str, string_to_date)

# Write the file again. This is inefficient but, I think, unavoidable.
csv_file.to_excel(writer, sheet_name='Sheet1', index=False, header=False)

writer.save()

Вывод (обратите внимание, что тип данных - Дата в Excel):

введите описание изображения здесь

См. Пояснение в Написание пользовательских типов в документации XlsxWriter. о том, как это работает.

Это в некоторой степени продвинутая часть XlsxWriter, и любой рабочий пример Pandas, вероятно, также будет сложным. Лучшим и более простым подходом, вероятно, было бы просто прочитать данные с помощью csv.py и напрямую преобразовать их в файл Excel с помощью XlsxWriter.

person jmcnamara    schedule 03.09.2020
comment
Спасибо за ваши деньги, отлично! Я согласен, что это работа, но это более чем нормально после недели борьбы ;-) - person Dylan_w; 04.09.2020