使用十进制秒将excel时间导入Pandas

时间:2014-01-08 19:06:28

标签: python parsing pandas xlrd

我有一个包含时间列的excel电子表格(.xls)。时间在Excel中显示为分钟:秒。秒。秒。如“50:59.2”“50:59.4”。原始数据包含hours:minutes:seconds.decimalseconds。

当我将数据导入熊猫时,我正在失去十分之一秒:

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')) 这是一个kludge,但至少它让我导入数据。

1 个答案:

答案 0 :(得分:0)

Pandas使用xlrd来阅读Excel文件和xlrd.xldate_as_tuple()函数,以便将日期组件提供给datetime.time()

但是,xlrd.xldate_as_tuple()只返回秒而不是微秒,以便信息丢失到pandas

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

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()返回,因此不能用于pandas。

这是xldate_as_tuple()的{​​{3}},但您可以提交the documented behaviour

更新:我feature request or a pull request为xlrd。