2011-01-07 35 views
57

我在寫一個需要timedelta輸入作爲字符串傳入的函數。用戶必須輸入類似「32m」或「2h32m」,甚至「4:13」或「5hr34m56s」......有沒有圖書館或者已經實現了這種東西的東西?如何從一個簡單的字符串構造一個timedelta對象

+0

對於只想用'd`天,`h`小時,`m`分鐘和`s`秒構造一個timedelta對象(導入`datetime`後)的人:`datetime.timedelta(days = d ,小時= h,分鐘= m,秒= s)`。 – 2017-04-18 22:09:22

回答

48

爲4:13,和其他標準格式(但如果你不知道哪一個)dateutil.parser.parse使用來自python-dateutil

爲第一格式(5hr34m56s),你應該使用解析規則表達式

在這裏重新基溶液:

import re 
from datetime import timedelta 


regex = re.compile(r'((?P<hours>\d+?)hr)?((?P<minutes>\d+?)m)?((?P<seconds>\d+?)s)?') 


def parse_time(time_str): 
    parts = regex.match(time_str) 
    if not parts: 
     return 
    parts = parts.groupdict() 
    time_params = {} 
    for (name, param) in parts.iteritems(): 
     if param: 
      time_params[name] = int(param) 
    return timedelta(**time_params) 


>>> from parse_time import parse_time 
>>> parse_time('12hr') 
datetime.timedelta(0, 43200) 
>>> parse_time('12hr5m10s') 
datetime.timedelta(0, 43510) 
>>> parse_time('12hr10s') 
datetime.timedelta(0,) 
>>> parse_time('10s') 
datetime.timedelta(0, 10) 
>>> 
+2

我正在考慮某種功能,可以將任何東西扔在它上面,但仍然能夠處理轉換爲timedelta。 – priestc 2011-01-07 17:15:14

+2

我加了基於解決方案的例子:) – virhilo 2011-01-07 17:26:28

58

對我來說最好的解決方法,而不必訴諸於外部庫如dateutil或手動解析輸入,是使用datetime's強大的strptime字符串解析方法。

from datetime import datetime, timedelta 
# we specify the input and the format... 
t = datetime.strptime("05:20:25","%H:%M:%S") 
# ...and use datetime's hour, min and sec properties to build a timedelta 
delta = timedelta(hours=t.hour, minutes=t.minute, seconds=t.second) 

在此之後,你可以用你的timedelta對象爲正常,將其轉換爲秒,以確保我們做了正確的事情等

print(delta) 
assert(5*60*60+20*60+25 == delta.total_seconds()) 
41

昨天我一點時間,我的手,所以我開發了@virhiloanswer到Python模塊,增加了幾個時間表達式格式,其中包括@priestc所要求的所有格式。

Source code is on github(麻省理工學院許可)任何人都想要它。這也是PyPI上:

pip install pytimeparse 

返回時間的秒數:

>>> from pytimeparse.timeparse import timeparse 
>>> timeparse('32m') 
1920 
>>> timeparse('2h32m') 
9120 
>>> timeparse('4:13') 
253 
>>> timeparse('5hr34m56s') 
20096 
>>> timeparse('1.2 minutes') 
72 
2

如果你使用Python 3,那麼這裏是爲哈日Shankar的解決方案,我用更新版本:

from datetime import timedelta 
import re 

regex = re.compile(r'(?P<hours>\d+?)/' 
        r'(?P<minutes>\d+?)/' 
        r'(?P<seconds>\d+?)$') 

def parse_time(time_str): 
    parts = regex.match(time_str) 
    if not parts: 
     return 
    parts = parts.groupdict() 
    print(parts) 
    time_params = {} 
    for name, param in parts.items(): 
     if param: 
      time_params[name] = int(param) 
    return timedelta(**time_params) 
3

我想輸入一段時間,然後將其添加到各種日期,所以這工作對我來說:

from datetime import datetime as dtt 

time_only = dtt.strptime('15:30', "%H:%M") - dtt.strptime("00:00", "%H:%M") 
相關問題