2012-07-02 89 views
4

我正在將人類可讀時間轉換爲datetime對象。爲了做到這一點,我使用datetime.datetime.strptimepython datetime.strptime:忽略第二部分

然而,我已經足夠簡單地瞭解了人類可讀的時間,它包含了我不能解析的幾分之一秒。如果這是一個常數,我可以將它作爲格式的一部分。然而,由於它不是一個常數,我無法這樣做。

這是我在做什麼現在:

>>> humanTime = '2012/06/10T16:36:20.509Z' 
>>> datetime.datetime.strptime(humanTime, "%Y/%m/%dT%H:%M:%SZ") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "lib/python2.7/_strptime.py", line 325, in _strptime 
    (data_string, format)) 
ValueError: time data '2012-06-10T16:36:20.507Z' does not match format '%Y-%m-%dT%H:%M:%SZ' 

所以我想,這裏的問題是,第二的分數不解析的。我真的不在乎這一秒鐘的一小部分。沒有切分字符串,有沒有辦法讓我可以要求datetime忽略第二部分(最好是格式)?

我有一種感覺,我可能會錯過一些非常基本的東西。我會很感激任何幫助。

+1

@downvoter:你想告訴我爲什麼我的問題不好嗎? – inspectorG4dget

回答

4

因爲我真的不在乎秒的小數部分,所以我應該首先讀取人類可讀字符串的第一個19字符,並在其上應用簡單的格式。

>>> humanTime = '2012/06/10T16:36:20.509Z' 
>>> datetime.datetime.strptime(humanTime[:19], "%Y/%m/%dT%H:%M:%S") 
datetime.datetime(2012, 6, 10, 16, 36, 20) 
3

解決您的具體問題:使用%F爲微秒:

>>> datetime.datetime.strptime(humanTime, "%Y/%m/%dT%H:%M:%S.%fZ") 

然而,問題依然存在的一般情況。如果你點後有6位以上的數字,那麼這個解決方案將不起作用。

問題是,就我所知,datetime.datetime.strptime接受的格式通常不包括浮動秒。解決方法是在創建datetime變量時忽略秒數,然後使用datetime.timedelta添加秒數。

>>> import numpy as np 
>>> import datetime 
>>> 
>>> humanTime = '2012/06/10T16:36:20.509Z' 
>>> dt_time_no_seconds = datetime.datetime.strptime(humanTime[:-8], "%Y/%m/%dT%H:%M") 
>>> seconds = np.float(humanTime[-7:-1]) 
>>> dt_time = dt_time_no_seconds+datetime.timedelta(seconds=seconds) 
>>> dt_time_no_seconds 
datetime.datetime(2012, 6, 10, 16, 36) 
>>> dt_time 
datetime.datetime(2012, 6, 10, 16, 36, 20, 509000) 

希望這會有所幫助。