Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在保持时间戳的同时将XLSX转换为CSV_Python_Excel_Csv_Time_Xlsx - Fatal编程技术网

Python 在保持时间戳的同时将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

我正在尝试将一个包含XLSX文件的目录转换为CSV。除了我遇到一个包含时间信息的列的问题外,一切都正常。XLSX文件是由另一个我无法修改的程序创建的。但我想保持在Excel中查看XLSX文件时显示的时间与在任何文本编辑器中转换为CSV时显示的时间相同

我的代码:

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提供了一种方法,它允许以各种格式轻松转换为字符串。