以小数秒将excel时间导入熊猫

Posted

技术标签:

【中文标题】以小数秒将excel时间导入熊猫【英文标题】:Import excel time into Pandas with decimal seconds 【发布时间】:2014-01-27 01:38:45 【问题描述】:

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

当我将数据导入 pandas 时,我损失了十分之一秒:

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

【问题讨论】:

我在read_excel() 的文档中看到了这一点:convert_float : boolean, default True convert integral floats to int (i.e., 1.0 –> 1). If False, all numeric data will be read in as floats: Excel stores all numbers as floats internally. 所以,你可以尝试使用convert_float=False 好建议。我只是尝试过,但它没有改变任何东西。仍然舍入小数秒。 【参考方案1】:

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() 没有返回,因此熊猫不可用。

这是the documented behaviour 中的xldate_as_tuple(),但您可以提交feature request or a pull request。

更新:我submitted a fix为此向xlrd。

【讨论】:

此评论没有回答如何导入小数秒数据的问题。它只是验证原因是 Pandas 使用了另一个库。但是,我确实提出了功能请求。

以上是关于以小数秒将excel时间导入熊猫的主要内容,如果未能解决你的问题,请参考以下文章

将日期从excel文件转换为熊猫

尽管是日期值,但使用显示日期时间的熊猫导入 excel 数据

使用python导入带有熊猫的excel [重复]

打开多个Excel文件以分离熊猫数据框

我需要哪个版本的 Hive 在小数秒内具有超过 6 个小数位的时间戳?

用poi导入excel文件时,导入文本会出现小数点怎么解决。