我在寫一個需要timedelta輸入作爲字符串傳入的函數。用戶必須輸入類似「32m」或「2h32m」,甚至「4:13」或「5hr34m56s」......有沒有圖書館或者已經實現了這種東西的東西?如何從一個簡單的字符串構造一個timedelta對象
57
A
回答
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)
>>>
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
昨天我一點時間,我的手,所以我開發了@virhilo的answer到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")
相關問題
- 1. 從字符串構造一個對象
- 2. 如何從字符串構造一個javascript Date對象
- 3. 如何構造一個長字符串
- 4. 如何從base64編碼的字符串構造一個java.security.PublicKey對象?
- 5. 使用JavaScript字符串構造一個對象屬性
- 6. 如何構造一個沒有重複字符的字符串?
- 7. 如何將標準timedelta字符串轉換爲timedelta對象
- 8. 如何構造一個Error對象。 iOS
- 9. 凡構造一個對象
- 10. 從第一個標籤抓取一個簡單的字符串
- 11. PHP構造一個Unicode字符串?
- 12. 將一個簡單的字符串對象傳遞給一個類
- 13. 從對象中有一個字符串
- 14. 如何構建一個網格字符串對象的引用
- 15. 使用一個簡單的構造的
- 16. 如何從多維數組構建一個簡單的字符串?
- 17. 如何從一個字符串的單個字符保存到一個NSDictionary對象
- 18. 如何從一個構造
- 19. 構造一個新的對象()與另一個對象
- 20. 從一個HTML字符串構建的jQuery對象中查找一個元素
- 21. PHP對象給一個字符串的值從一個mysqli_fetch_array
- 22. 鑄造一個字符串,一個int從一個JTextField在Java
- 23. 如何評估一個字符串到一個jQuery對象?
- 24. 如何檢查一個對象是否是一個字符串?
- 25. 在UUID對象從領域構建一個字符串
- 26. 如何獲得一個字符串的枚舉構造函數?
- 27. 如何附加(連接)字符串來構造一個新的字符串?
- 28. 構造一個要插入到unordered_map的對(字符串*節點)
- 29. 如何從Java中的字符串創建一個XML對象?
- 30. 解析一個字符串構造一個樹在Java中
對於只想用'd`天,`h`小時,`m`分鐘和`s`秒構造一個timedelta對象(導入`datetime`後)的人:`datetime.timedelta(days = d ,小時= h,分鐘= m,秒= s)`。 – 2017-04-18 22:09:22