2015-04-01 18 views
6

Değeri var 38142 Python kullanarak tarih biçimine dönüştürmem gerekiyor. Eğer bu numarayı excel içinde kullanırsanız ve o zaman bir hücreyi sağ tıklayıp biçimlendirirseniz, değer 04/06/2004'e dönüştürülür ve aynı sonucu python kullanarak kullanmam gerekir. BuBelirli bir sıra numarası (Excel'den) bir tarihe dönüştürme

+0

Bu garip bir ordinal; 04/06/2004'ün doğru olduğuna emin misin? 38142 değeri * gün * anlamına gelirse, bu, ay olarak yorumladığınız şeye göre, 1993/12/25 veya 1993/10/27 den bir sapma olur. –

+0

[Tarihe dönüştürülecek formülü] (http://stackoverflow.com/q/19721416), 1900/01/01 tarihinden bu yana, date.fromordinal() 'in hangi günlerde geçeceğini önerir. Ama o sayı bir rakam eksik o zaman. –

+0

Benim dosyam, ordinalini bilmediğim bir değer var mı, yoksa müvekkilimin olağan dışı olduğunu söyledi ve bana "eğer gerçek tarihi bulmak istiyorsanız, o zaman verilen değer için excel'i excel olarak biçimlendirin "@MartijnPieters – Krish

cevap

10

'u nasıl elde edebilirim? Excel'deki ofset 1900/01/01; Bir timedelta olarak gün sayısını ekleyin:

from datetime import date, timedelta 

def from_excel_ordinal(ordinal, _epoch=date(1900, 1, 1)): 
    if ordinal > 59: 
     ordinal -= 1 # Excel leap year bug, 1900 is not a leap year! 
    return _epoch + timedelta(days=ordinal - 1) # epoch is day 1 

Ben 1900/02/28 sonra herhangi bir tarih için tarafından ordinal ayarlamak zorunda; Excel, Lotus 1-2-3'ten leap year bug bir miras almıştır ve 1900'ü bir artık yıl olarak kabul eder. Yukarıdaki kod, 59 ve 60 için bunun için date(1900, 2, 28) döndürür.

+0

Mükemmel, Teşekkürler Çok teşekkürler @Martijn Pieters – Krish

+0

@Krish: Hata Joel Spolsky tarafından popülerleştirildi: [İlk BillG İnceleme] (http://www.joelonsoftware.com/items/2006/06/16.html) – jfs

+0

Çağın 31 Aralık 1899 değil olduğuna emin misin? 'datetime (1899, 12, 31) + timedelta (ordinal - (ordinal> 59)) – jfs

2
from datetime import datetime, timedelta 

def from_excel_ordinal(ordinal, epoch=datetime(1900, 1, 1)): 
    # Adapted from above, thanks to @Martijn Pieters 

    if ordinal > 59: 
     ordinal -= 1 # Excel leap year bug, 1900 is not a leap year! 
    inDays = int(ordinal) 
    frac = ordinal - inDays 
    inSecs = int(round(frac * 86400.0)) 

    return epoch + timedelta(days=inDays - 1, seconds=inSecs) # epoch is day 1 

excelDT = 42548.75001   # Float representation of 27/06/2016 6:00:01 PM in Excel format 
pyDT = from_excel_ordinal(excelDT) 

yukarıdaki cevabı sadece tarih değeri için iyidir, ama burada zaman dahil ve aynı zamanda bir tarih saat değerlerini döndürmek için yukarıdaki çözüm uzanır.

İlgili konular