将excel时间导入Pandas(以十进制秒为单位)



我有一个excel电子表格(.xls),其中包含一个时间列。时间在Excel中显示为分钟:秒。十分之一秒。例如"50:59.2"50:594"。原始数据包含小时:分钟:秒。小数秒。

当我把数据导入熊猫时,我失去了十分之一秒:

indata=pd.read_excel('Data.xls','Tabular Data',header=9,skiprows=[1,2,3,4,5,6,7,8,10,11,12])
indata['Time']
0     17:50:59
1     17:51:00
2     17:51:00
3     17:51:00
...
indata.Time[0].microsecond
0
indata.Time[1].microsecond
0

我还尝试将:pd.ExcelFile()与xls.parse一起使用,但得到了相同的结果。有没有办法控制Pandas如何从Excel中解析时间?它在小时、分钟和秒方面都是"正确的",但它正在减少十,这是我确实需要的。

附加信息:

作为测试,我也只是尝试使用xlrd直接读取数据。正如预期的那样,它在时间上确实以浮点形式读取。但是,如果我尝试在一些时间数据上使用xlrd.xldate_as_tuple(),我会丢失几分之一秒。而如果我直接使用datetime.timedelta(),我会看到小数秒
也许问题是xlrd正在丢弃数据?

解决方法:

我想出了一个变通办法。它并不能解决根本问题,但它确实允许我读取数据
我在Excel中打开了电子表格,并创建了一个新的时间列,该列是基于时间的纯文本(名为time_str):=TEXT(A13,"h:mm:ss.0")
并保存了它。然后我可以使用pd.read_excel读取电子表格
最后,我将这个新专栏转换为Pandas中的一个时间,如下所示:indata_t['Time2']=indata_t.Time_str.apply(lambda x:datetime.datetime.strptime(x,'%H:%M:%S.%f'))

或者,添加这样的日期:indata_t['Time2']=indata_t.Time_str.apply(lambda x:datetime.datetime.strptime('2009-01-11'+x,'%Y-%m-%d%H:%m:%S.%f')这是一个拼凑,但至少它让我导入了数据。

Pandas使用xlrd读取Excel文件,使用xlrd.xldate_as_tuple()函数获取要输入到datetime.time()中的日期组件。

然而,xlrd.xldate_as_tuple()只返回秒而不是微秒,因此信息丢失给pandas

例如,假设你有一个这样的Excel文件(数字与时间相同,但没有格式):

Time            Number
0:17:51.000     0.012395833
0:17:51.200     0.012398148
0:17:51.400     0.012400463
0:17:51.600     0.012402778
0:17:52.800     0.012416667
0:17:53.000     0.012418981

然后,如果您使用以下程序读取数据:

import xlrd
workbook = xlrd.open_workbook('minutes.xls')
worksheet = workbook.sheet_by_name('Sheet1')
cell =  worksheet.cell(2,0)
# Print the A2 cell value as a number.
print cell.value
# Print the seconds part of the A2 cell value.
print (cell.value * (24*60*60)) % 60
# Print the xldate_as_tuple output.
print xlrd.xldate_as_tuple(cell.value, workbook.datemode)

您得到以下输出:

0.0123981481481
51.2
(0, 0, 0, 0, 17, 51)

因此,秒的小数部分被读取(51.2),但xldate_as_tuple()不会返回,因此熊猫不可用。

这是xldate_as_tuple()的记录行为,但您可以提交功能请求或拉取请求。

更新:我向xlrd提交了一个修复程序。

最新更新