2013-07-24 2 views
8

Python에서 xlrd를 사용하여 텍스트, 숫자 및 날짜가 포함 된 파일을 가져 오려고했습니다. Python : float의 xlrd 식별 날짜

내가 좋아하는 뭔가를 시도 :

if "/" in worksheet.cell_value: 
    do_this 
else: 
    do_that 

을하지만 후자의 발견 날짜가 수레가 아닌 문자열로 저장되므로 그 소용했다. datetime 형식으로 변환하려면 다음을 수행하십시오.

try: 
    get_row = str(datetime.datetime(*xlrd.xldate_as_tuple(worksheet.cell_value(i, col - 1), workbook.datemode))) 
except: 
    get_row = unicode(worksheet.cell_value(i, col - 1)) 

셀에 텍스트가 포함 된 경우 예외가 있습니다. 지금은 모든 숫자가 날짜로 변환되기 때문에 숫자와 날짜를 날짜로 가져 오려고합니다.

아이디어가 있으십니까?

+0

Excel에서 날짜와 숫자를 구분할 수 없다고 생각하면 안됩니다. – pnuts

답변

8

음, 신경 쓰지 마라, 나는 해결책을 발견했다. 그리고 여기있다!

try: 
    cell = worksheet.cell(row - 1, i) 
    if cell.ctype == xlrd.XL_CELL_DATE: 
     date = datetime.datetime(1899, 12, 30) 
     get_ = datetime.timedelta(int(worksheet.cell_value(row - 1, i))) 
     get_col2 = str(date + get_)[:10] 
     d = datetime.datetime.strptime(get_col2, '%Y-%m-%d') 
     get_col = d.strftime('%d-%m-%Y') 
    else: 
     get_col = unicode(int(worksheet.cell_value(row - 1, i))) 
except: 
    get_col = unicode(worksheet.cell_value(row - 1, i)) 

약간의 설명 : xlrd를 사용하면 실제로 셀 유형을 확인하고 날짜가 맞는지 여부를 확인할 수 있습니다. 또한 Excel은 주간을 저장하는 이상한 방법이있는 것 같습니다. 그것들을 수레로 저장하고 (몇 일 동안 왼쪽 파트, 몇 시간 동안 오른쪽 파트) 그리고 특정 날짜 (1899, 12, 30, OK로 작동하는 것처럼 보임)를 취하고 플로트에서 일과 시간을 추가하여 날짜를 만듭니다. 그래서 내가 원했던 날짜를 만들기 위해, 나는 그것들을 추가하고 시간 (00.00.00 또는 뭔가 ...)을 없애기 위해 10 개의 첫 글자 ([: 10]) 만 남겼습니다. 나는 또한 그리스에서 우리는 다른 순서를 사용하기 때문에 일 - 월 - 일의 순서를 변경했다. 마지막으로이 코드는 숫자를 정수로 변환 할 수 있는지 검사합니다 (내 프로그램에 수레가 표시되는 것을 원하지 않습니다.) 모든 것이 실패하면 그대로 셀을 사용합니다 (경우에 따라 셀의 문자열 ...). 유용하다는 것을 알기를 바랍니다. 불가능하다고 생각되는 다른 스레드가 있다고 생각합니다.

+1

Windows/Mac의 Excel은 원본 지점과 다릅니다 (통합 문서의 datemode 속성이있는 것입니다). 그래서 datetime을 하드 코딩하지 않고 사용해야합니다. 또한 플로트에서 요소를 잘라내어 (날짜/시간이 Excel에 저장되는 방법과 같이) 요소를 잘라내어 하루 만에 날짜를 표시 할 수있는 충분한 정보를 깎아내는 것이 가능합니다 (드물 긴하지만 가능합니다). 이 질문에 대한 답은 원래 질문 이었지만 cell.ctype 검사를 추가하면 완료되었습니다. –

+0

float에 포함 된 시간은 모두 00.00.00이므로 아무것도 아닙니다 ... 그리고 내가 원래의 질문에 사용했던 것은 다루기 힘들었고, 버그 일 수도 있었고 왜 그런지 알지 못해서 날짜의 순서를 바꿀 수 없었습니다 (그리고 그것은 필수적입니다 ...) – Antoni4040

+0

수식이 올바르지 않습니다. 예를 들어'cell_value = 30'이라면 수식이'29-01-1900'을 반환하고'30-01-1900'을 반환해야합니다. [Excel에서 주어진 서수를 어떻게 날짜로 변환합니까? http://stackoverflow.com/q/29387137/4279). 또는 (더 잘) [@chewynougat 'answer/comments] (http://stackoverflow.com/a/18016189/4279)에서와 같이'xlrd' 메소드를 사용하십시오. 또한'date + get_'은 이미 datetime 객체입니다 : str로 변환 할 필요가없고 datetime으로 변환 할 필요가 없습니다. 다른 형식으로 str로 변환하기 위해서입니다. 단지'를 사용하여 원하는 형식으로 변환하십시오. strftime()'. – jfs

9

xlrd에서 사용할 수있는 도구를 더 많이 사용하면 훨씬 간단 해집니다.

cell_type = worksheet.cell_type(row - 1, i) 
cell_value = worksheet.cell_value(row - 1, i) 

if cell_type == xlrd.XL_CELL_DATE: 
    # Returns a tuple. 
    dt_tuple = xlrd.xldate_as_tuple(cell_value, workbook.datemode) 
    # Create datetime object from this tuple. 
    get_col = datetime.datetime(
     dt_tuple[0], dt_tuple[1], dt_tuple[2], 
     dt_tuple[3], dt_tuple[4], dt_tuple[5] 
    ) 
elif cell_type == xlrd.XL_CELL_NUMBER: 
    get_col = int(cell_value) 
else: 
    get_col = unicode(cell_value) 
+6

두 가지. (1)'*'연산자를 사용하여 튜플을 풀 수 있습니다. 그래서'get_col = datetime.datetime (* dt_tuple)'입니다. (2) xlrd 0.9.3부터'xldate_as_tuple' 대신'xldate.xldate_as_datetime' 함수를 사용할 수 있습니다. 0.9.3은이 답변보다 새로운 것입니다. –

관련 문제