2014-01-08 2 views
2

시간 열을 포함하는 스프레드 시트 (.xls)가 있습니다. 시간은 분 단위로 Excel에 표시됩니다 (초 단위). 예 : "50 : 59.2" "50 : 59.4" 원시 데이터에는시 : 분 : 초 .decimalseconds가 들어 있습니다. 나는 또한 사용하려고10 진수 초로 판다에 엑셀 시간을 가져 오십시오.

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과를하지만 같은 결과를 얻었다. 팬더가 Excel에서 시간을 구문 분석하는 방법을 제어 할 수있는 방법이 있습니까? 그것은 시간, 분, 초의 측면에서 "정확"해지고 있지만, 나는 그것이 필요로하는 수십을 떨어 뜨리고 있습니다.

추가 정보 : 테스트로

은 또한 단지 데이터를 직접 읽어 xlrd 사용하려고했습니다. 예상대로 플로트로 읽습니다. 그러나 일부 시간 데이터에서 xlrd.xldate_as_tuple()을 사용하려고하면 1 초의 분수가 느슨합니다. 대신 datetime.timedelta()를 직접 사용하는 경우 10 진수 초가 표시됩니다.
아마 문제는 xlrd가 데이터를 삭제하고 있다는 것입니다.

직장 주변 :

나는 문제를 해결했습니다. 기본 문제는 해결되지 않지만 데이터를 읽을 수는 있습니다.
Excel에서 스프레드 시트를 열고 Time_str이라는 이름의 시간 기반 텍스트 전용 새 열을 만들었습니다. = TEXT (A13, "h : mm : ss.0")
저장 . 그런 다음 pd.read_excel을 사용하여 스프레드 시트를 읽을 수있었습니다.
마지막으로이 새로운 열을 팬더에서 다음과 같이 변환했습니다. indata_t [ 'Time2'] = indata_t.Time_str.apply (lambda x : datetime.datetime.strptime (x, '% H : % M : % % d '))

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

문서에서'read_excel()'을 볼 수 있습니다 : convert_float : boolean, default True 정수 부동 소수점을 int (즉, 1.0 -> 1)로 변환합니다. False이면 모든 숫자 데이터가 실수로 읽혀집니다. Excel에서는 모든 숫자를 부동 소수점으로 저장합니다.'convert_float = False'를 사용해보십시오. – David

+0

좋습니다. 방금 시도했지만 아무 것도 바뀌지 않았습니다. 여전히 십진수 초를 반올림합니다. – Adam

답변

0

팬더는 Excel 파일을 읽는 데 xlrd을 사용하고 datetime.time()에 공급할 날짜 구성 요소를 가져 오는 기능을 xlrd.xldate_as_tuple()으로 사용했습니다.

그러나 xlrd.xldate_as_tuple()은 초를 나타내며 마이크로 초가 아니기 때문에 정보는 pandas까지 손실됩니다. 예를 들어

, 당신은 엑셀 (번호 형식의 시간 그러나없이 동일)이 같은 파일이 있다고 가정 :

:

Time   Number 
0:17:51.000  0.
0:17:51.200  0.
0:17:51.400  0.012400463 
0:17:51.600  0.012402778 
0:17:52.800  0.012416667 
0:17:53.000  0.012418981 

그런 다음 프로그램으로 데이터를 읽을 경우

0.
51.2 
(0, 0, 0, 0, 17, 51) 

그래서, 초 소수 부분이 다시는 다음과 같습니다

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) 

는 다음과 같은 출력을 얻을 광고 (51.2)는 xldate_as_tuple()에 의해 반환되지 않으므로 팬더에는 사용할 수 없습니다.

the documented behaviourxldate_as_tuple()이지만, feature request or a pull request을 제출할 수 있습니다.

업데이트 : I submitted a fix for this to xlrd.

+0

이 주석은 10 진수 초 데이터를 가져 오는 방법에 대한 질문에는 응답하지 않습니다. 원인이 다른 라이브러리를 사용하는 판다임을 확인합니다. 그러나 기능 요청을했습니다. – Adam