Python 在保持时间戳的同时将XLSX转换为CSV
我正在尝试将一个包含XLSX文件的目录转换为CSV。除了我遇到一个包含时间信息的列的问题外,一切都正常。XLSX文件是由另一个我无法修改的程序创建的。但我想保持在Excel中查看XLSX文件时显示的时间与在任何文本编辑器中转换为CSV时显示的时间相同 我的代码:Python 在保持时间戳的同时将XLSX转换为CSV,python,excel,csv,time,xlsx,Python,Excel,Csv,Time,Xlsx,我正在尝试将一个包含XLSX文件的目录转换为CSV。除了我遇到一个包含时间信息的列的问题外,一切都正常。XLSX文件是由另一个我无法修改的程序创建的。但我想保持在Excel中查看XLSX文件时显示的时间与在任何文本编辑器中转换为CSV时显示的时间相同 我的代码: import csv import xlrd import os import fnmatch import Tkinter, tkFileDialog, tkMessageBox def main(): root = Tki
import csv
import xlrd
import os
import fnmatch
import Tkinter, tkFileDialog, tkMessageBox
def main():
root = Tkinter.Tk()
root.withdraw()
print 'Starting .xslx to .csv conversion'
directory = tkFileDialog.askdirectory()
for fileName in os.listdir(directory):
if fnmatch.fnmatch(fileName, '*.xlsx'):
filePath = os.path.join(directory, fileName)
saveFile = os.path.splitext(filePath)[0]+".csv"
savePath = os.path.join(directory, saveFile)
workbook = xlrd.open_workbook(filePath)
sheet = workbook.sheet_by_index(0)
csvOutput = open(savePath, 'wb')
csvWriter = csv.writer(csvOutput, quoting=csv.QUOTE_ALL)
for row in xrange(sheet.nrows):
csvWriter.writerow(sheet.row_values(row))
csvOutput.close()
print '.csv conversion complete'
main()
要添加一些详细信息,如果我在Excel中打开一个文件,我会在时间列中看到:
00:10.3
00:14.2
00:16.1
00:20.0
00:22.0
但在转换为CSV后,我在同一位置看到:
0.000118981
0.000164005
0.000186227
0.000231597
0.000254861
多亏了seanmhanson的回答,我才知道Excel将泰晤士报作为一天的小数点进行转储。虽然我应该尝试更好地学习和使用xlrd,但为了快速短期修复,我能够将其转换为秒,然后从秒转换回最初看到的HH:MM:SS的时间格式。下面是我的(可能很难看)代码,以防任何人都能使用它:
import csv
import xlrd
import os
import fnmatch
from decimal import Decimal
import Tkinter, tkFileDialog
def is_number(s):
try:
float(s)
return True
except ValueError:
return False
def seconds_to_hms(seconds):
input = Decimal(seconds)
m, s = divmod(input, 60)
h, m = divmod(m, 60)
hm = "%02d:%02d:%02.2f" % (h, m, s)
return hm
def main():
root = Tkinter.Tk()
root.withdraw()
print 'Starting .xslx to .csv conversion'
directory = tkFileDialog.askdirectory()
for fileName in os.listdir(directory):
if fnmatch.fnmatch(fileName, '*.xlsx'):
filePath = os.path.join(directory, fileName)
saveFile = os.path.splitext(filePath)[0]+".csv"
savePath = os.path.join(directory, saveFile)
workbook = xlrd.open_workbook(filePath)
sheet = workbook.sheet_by_index(0)
csvOutput = open(savePath, 'wb')
csvWriter = csv.writer(csvOutput, quoting=csv.QUOTE_ALL)
rowData = []
for rownum in range(sheet.nrows):
rows = sheet.row_values(rownum)
for cell in rows:
if is_number(cell):
seconds = float(cell)*float(86400)
hms = seconds_to_hms(seconds)
rowData.append((hms))
else:
rowData.append((cell))
csvWriter.writerow(rowData)
rowData = []
csvOutput.close()
print '.csv conversion complete'
main()
Excel将时间存储为以天为单位的浮动时间。您需要使用XLRD来确定单元格是否为日期,然后根据需要对其进行转换。我对XLRD不太在行,但您可能需要类似于此的内容,如果希望保留前导零,请更改字符串格式:
if cell.ctype == xlrd.XL_CELL_DATE:
try:
cell_tuple = xldate_as_tuple(cell, 0)
return "{hours}:{minutes}:{seconds}".format(
hours=cell_tuple[3], minutes=cell_tuple[4], seconds=cell_tuple[5])
except (any exceptions thrown by xldate_as_tuple):
//exception handling
XLRD日期到元组方法的文档可在以下位置找到:
对于已回答的类似问题,另请参见此问题:在导出时间列之前是否尝试将其转换为纯文本?@VanCowboy问题在于excel提供了基础数据的格式化视图。原始数据实际上是十进制的,所以我不认为转换成纯文本会解决我的问题。我在下面选择的答案更好地解释了这一点,我更改了代码以解决上面的问题。您的答案帮助我解决了我的问题,因此我将其标记为这样。我最终选择了另一条对我来说更快实现的路线(上面的代码就是这样发布的),但从长远来看,我可能应该学会更好地使用xlrd。是的,我同意上面的方法绝对不是满足您需求的最佳解决方案,(我只需要乘以秒数,然后格式化秒数)但很高兴知道它的存在/您应该检查XLRD的一些方法。如果你做了其他事情,你应该发布它!xlrd 0.9.3于2014年4月发布,它包含函数
xldate.xldate\u as_datetime
,可将Excel日期直接转换为Python日期时间。尽管如此,这还是一个相对较小的方便,因为从元组创建日期、时间或日期时间非常简单。要知道的主要事情是Python提供了一种方法,它允许以各种格式轻松转换为字符串。