我有一个excel电子表格(.xls),其中包含一个时间列。时间在Excel中显示为分钟:秒。十分之一秒。例如"50:59.2"50:594"。原始数据包含小时:分钟:秒。小数秒。
当我把数据导入熊猫时,我失去了十分之一秒:
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')这是一个拼凑,但至少它让我导入了数据。
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()
不会返回,因此熊猫不可用。
这是xldate_as_tuple()
的记录行为,但您可以提交功能请求或拉取请求。
更新:我向xlrd提交了一个修复程序。