जवाबों:
पहले प्रारूप (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, 43210)
>>> parse_time('10s')
datetime.timedelta(0, 10)
>>>
dateutil.parser.parse
timedelta
वस्तुओं को पार्स नहीं करेंगे । यह रिटर्न करता है datetime
, और यह जैसे तार के लिए एक अपवाद को ट्रिगर करेगा '28:32:11.10'
।
मेरे लिए सबसे सुरुचिपूर्ण समाधान, बाहरी पुस्तकालयों जैसे कि डेटुतिल या मैन्युअल रूप से इनपुट पार्स करने के लिए सहारा के बिना, डेटाइम के शक्तिशाली 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)
इसके बाद आप अपने टाइमडेल्टा ऑब्जेक्ट को सामान्य रूप से उपयोग कर सकते हैं, यह सुनिश्चित करने के लिए सेकंड में कनवर्ट करें कि हमने सही काम किया है आदि।
print(delta)
assert(5*60*60+20*60+25 == delta.total_seconds())
datetime.strptime("32:20:25","%H:%M:%S")
काम नहीं करता है), और आपको सटीक इनपुट प्रारूप जानना होगा।
timedelta
बहुत कष्टप्रद पैरामीटर के लिए नामित मापदंडों को मैन्युअल रूप से निर्दिष्ट करने की आवश्यकता है , लेकिन सबसे अच्छा मैं इससे बचने के लिए आ सकता हूं:: delta = t - datetime.combine(t.date(), time.min)
, जो ... भयानक है।
मेरे हाथों में कल थोड़ा समय था, इसलिए मैंने पायथन मॉड्यूल में @virhilo के उत्तर को विकसित किया, @priestc द्वारा अनुरोध किए गए उन सभी सहित कुछ और समय के अभिव्यक्ति प्रारूप जोड़े ।
कोई भी व्यक्ति जो चाहता है, उसके लिए स्रोत कोड github (MIT लाइसेंस) पर है। यह 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
मैं सिर्फ एक बार इनपुट करना चाहता था और फिर इसे विभिन्न तारीखों में जोड़ता था ताकि मेरे लिए यह काम करे:
from datetime import datetime as dtt
time_only = dtt.strptime('15:30', "%H:%M") - dtt.strptime("00:00", "%H:%M")
dtt.strptime(myduration, "%H:%M:%S") - dtt(1900, 1, 1)
यह भी काम करता है ...
मैंने कुछ उन्नयन के साथ विहिलो के अच्छे उत्तर को संशोधित किया है :
3m0.25s
लिए 3 मिनट, 0.25 सेकंड)।
import re
from datetime import timedelta
regex = re.compile(r'^((?P<days>[\.\d]+?)d)?((?P<hours>[\.\d]+?)h)?((?P<minutes>[\.\d]+?)m)?((?P<seconds>[\.\d]+?)s)?$')
def parse_time(time_str):
"""
Parse a time string e.g. (2h13m) into a timedelta object.
Modified from virhilo's answer at https://stackoverflow.com/a/4628148/851699
:param time_str: A string identifying a duration. (eg. 2h13m)
:return datetime.timedelta: A datetime.timedelta object
"""
parts = regex.match(time_str)
assert parts is not None, "Could not parse any time information from '{}'. Examples of valid strings: '8h', '2d8h5m20s', '2m4s'".format(time_str)
time_params = {name: float(param) for name, param in parts.groupdict().items() if param}
return timedelta(**time_params)
यदि आप पायथन 3 का उपयोग करते हैं, तो यहां हरि शंकर के समाधान के लिए अद्यतन संस्करण, जिसका मैंने उपयोग किया है:
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)
Django उपयोगिता फ़ंक्शन के साथ आता है parse_duration()
। से प्रलेखन :
एक स्ट्रिंग पार्स करता है और एक लौटता है
datetime.timedelta
।
"DD HH:MM:SS.uuuuuu"
आईएसओ 8601 (जैसेP4DT1H15M20S
जो इसके बराबर है4 1:15:20
) या पोस्टग्रेएसक्यूएल के दिन-अंतराल अंतराल प्रारूप (जैसे3 days 04:05:06
) द्वारा निर्दिष्ट प्रारूप में डेटा की अपेक्षा करता है ।
आईएसओ 8601 अवधि स्ट्रिंग को पार्स करने के लिए आइसोडेट लाइब्रेरी का उपयोग करें । उदाहरण के लिए:
isodate.parse_duration('PT1H5M26S')
यह भी देखें कि क्या आईएसओ 8601 की अवधि को समयबद्धता में बदलने का एक आसान तरीका है?
d
दिन,h
घंटे,m
मिनट औरs
सेकंड का समयबद्ध वस्तु का निर्माण करना चाहते हैं :।datetime
datetime.timedelta(days = d, hours = h, minutes=m, seconds=s)