我有一个包含时间列的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,但至少它让我导入数据。
答案 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。