【发布时间】: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 -
好建议。我只是尝试过,但它没有改变任何东西。仍然舍入小数秒。
标签: python parsing pandas xlrd