pd.ExcelWriter,追加日期时间但得到:未知或不受支持的日期时间类型
pd.ExcelWriter, append datetime but got: Unknown or unsupported datetime type
我正在制作一个工具来导入 .txt 文件并使用 pd.ExcelWriter 将其导出为 .xslx 文件。对于导入,我使用 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
导出可以工作(仅使用第一个代码块),但是由于 python 控制台中的错误,得到 excel 识别日期时间不起作用。
完全错误
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
期望输出
完美,除了无法识别日期时间。
我尝试了各种不同的 Pandas parse_dates
和类似的选项,但我无法让它们与您的输入数据格式一起使用。也许其他人会解决这个问题,post 一个可行的例子。
作为替代方案,这里有一个扩展默认 Xlsxwriter worksheet.write()
方法的版本,可将 date-like 字符串即时转换为 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中数据类型为“Date”):
请参阅 XlsxWriter 文档中的 Writing user defined types,了解其工作原理。
这是 XlsxWriter 的高级版本,任何有效的 Pandas 示例也可能很复杂。更好更简单的方法可能是使用 csv.py 读取数据并直接使用 XlsxWriter 将其转换为 Excel 文件。
我正在制作一个工具来导入 .txt 文件并使用 pd.ExcelWriter 将其导出为 .xslx 文件。对于导入,我使用 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
导出可以工作(仅使用第一个代码块),但是由于 python 控制台中的错误,得到 excel 识别日期时间不起作用。
完全错误
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
期望输出
完美,除了无法识别日期时间。
我尝试了各种不同的 Pandas parse_dates
和类似的选项,但我无法让它们与您的输入数据格式一起使用。也许其他人会解决这个问题,post 一个可行的例子。
作为替代方案,这里有一个扩展默认 Xlsxwriter worksheet.write()
方法的版本,可将 date-like 字符串即时转换为 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中数据类型为“Date”):
请参阅 XlsxWriter 文档中的 Writing user defined types,了解其工作原理。
这是 XlsxWriter 的高级版本,任何有效的 Pandas 示例也可能很复杂。更好更简单的方法可能是使用 csv.py 读取数据并直接使用 XlsxWriter 将其转换为 Excel 文件。