以小数秒将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 数据