2010-05-06 19 views
8

पायथन में मैं निम्नलिखित समय कैसे जोड़ूं?पायथन समय के साथ संक्षेप

0:00:00 
0:00:15 
9:30:56 
+0

मुझे लगता है आप 00:00:00 से मतभेद को जोड़ने के लिए करना चाहते हैं? यानी, वास्तविक समय की बजाय डेल्टा? –

+0

@steve: ठीक है, डेल्टा '9: 30: 56' – SilentGhost

+0

तक जोड़ देगा, मैं अजगर 2.4 का उपयोग कर रहा हूं और मैं स्ट्रिपटाइम का उपयोग नहीं कर सकता, हाँ मैं डेल्टा जोड़ना चाहता हूं और उपर्युक्त उदाहरण के लिए उत्तर 9 होना चाहिए : 31: 11 – Hulk

उत्तर

9

स्ट्रिंग की एक सूची के रूप में?

timeList = [ '0:00:00', '0:00:15', '9:30:56' ] 
totalSecs = 0 
for tm in timeList: 
    timeParts = [int(s) for s in tm.split(':')] 
    totalSecs += (timeParts[0] * 60 + timeParts[1]) * 60 + timeParts[2] 
totalSecs, sec = divmod(totalSecs, 60) 
hr, min = divmod(totalSecs, 60) 
print "%d:%02d:%02d" % (hr, min, sec) 

परिणाम:

9:31:11 
+0

मेरे पास यह एक सरणी में वर्णित तारों के रूप में था .. धन्यवाद .... – Hulk

+0

सिर्फ 'divmod()' कुछ एयरप्ले देने के लिए +1 ... दयालुता कभी भी बहादुर नहीं था ताकि जीवीआर को '/%' लागू करने के लिए अनुरोध किया जा सके और '/% =' ऑपरेटर ;-) ... इसे पढ़ें और रोएं: 'मिनट, सेकंड /% = 60; घंटे, मिनट /% = 60; दिन, घंटे /% = 24' –

+4

@ जॉन: मुझे व्यक्तिगत रूप से यह अवैध लगता है। आपको याद रखना होगा कि एलएचएस पर कौन सी चीज इनपुट लाभांश है। यह एक ऐसा मामला भी बनाता है जहां एक ऑपरेटर टुपल लौटाता है, जो चेनिंग ऑपरेशंस को रोकता है, जो बाइनरी ऑपरेटरों का पूरा बिंदु है। मुझे 'divmod' रास्ता एक * बहुत * स्पष्ट लगता है। –

2

मान लें कि आप एक कुल समय के लिए सेकंड जोड़ना चाहते हैं:

def parse_time(s): 
    hour, min, sec = s.split(':') 
    try: 
     hour = int(hour) 
     min = int(min) 
     sec = int(sec) 
    except ValueError: 
     # handle errors here, but this isn't a bad default to ignore errors 
     return 0 
    return hour * 60 * 60 + min * 60 + sec 

print parse_time('0:00:00') + parse_time('0:00:15') + parse_time('9:30:56') 
0

अनुभवहीन दृष्टिकोण (अपवाद हैंडलिंग के बिना):

#!/usr/bin/env python 

def sumup(*times): 
    cumulative = 0 
    for t in times: 
     hours, minutes, seconds = t.split(":") 
     cumulative += 3600 * int(hours) + 60 * int(minutes) + int(seconds) 
    return cumulative 

def hms(seconds): 
    """Turn seconds into hh:mm:ss""" 
    hours = seconds/3600 
    seconds -= 3600*hours 
    minutes = seconds/60 
    seconds -= 60*minutes 
    return "%02d:%02d:%02d" % (hours, minutes, seconds) 

if __name__ == '__main__': 
    print hms(sumup(*("0:00:00", "0:00:15", "9:30:56"))) 
    # will print: 09:31:11 
19

यह आपके द्वारा इस फ़ॉर्म पर निर्भर करता है, उदाहरण के लिए आप पहले से ही उन्हें datetime.timedelta रों के रूप में है, तो आप सिर्फ उन्हें योग सकता:

>>> s = datetime.timedelta(seconds=0) + datetime.timedelta(seconds=15) + datetime.timedelta(hours=9, minutes=30, seconds=56) 
>>> str(s) 
'9:31:11' 
+2

का उपयोग करके बेहतर है मुझे लगता है कि यह डेल्टा – dassouki

2
lines = ["0:00:00", "0:00:15", "9:30:56"] 
total = 0 
for line in lines: 
    h, m, s = map(int, line.split(":")) 
    total += 3600*h + 60*m + s 
print "%02d:%02d:%02d" % (total/3600, total/60 % 60, total % 60) 
+0

उम्मम्म का उपयोग करके सबसे सही समाधान है, इसे टैग किया गया है 'पायथन' नहीं 'awk'; '3600 *" 0 "'गणना नहीं करेगा; आपको 'int()' का उपयोग करने की आवश्यकता है; आपको इसे –

+0

प्रकाशित करने से पहले सामानों का परीक्षण करने की आवश्यकता है। मैंने 'नक्शा जोड़ा है (int' – jfs

+0

@ जॉन ओह! आप सही हैं। – Bolo

5

मैं वास्तव में निराश हूँ अगर कोई और अधिक pythonic समाधान नहीं है ... :(

भयानक एक ->

timeList = [ '0:00:00', '0:00:15', '9:30:56' ] 

ttt = [map(int,i.split()[-1].split(':')) for i in timeList] 
seconds=reduce(lambda x,y:x+y[0]*3600+y[1]*60+y[2],ttt,0) 
#seconds == 34271 

यह एक भयानक भी लग रहा है ->

zero_time = datetime.datetime.strptime('0:0:0', '%H:%M:%S') 
ttt=[datetime.datetime.strptime(i, '%H:%M:%S')-zero_time for i in timeList] 
delta=sum(ttt,zero_time)-zero_time 
# delta==datetime.timedelta(0, 34271) 

# str(delta)=='9:31:11' # this seems good, but 
# if we have more than 1 day we get for example str(delta)=='1 day, 1:05:22' 

सच निराशा भी यह है ->

sum(ttt,zero_time).strftime('%H:%M:%S') # it is only "modulo" 24 :( 

मैं वास्तव में देखने के लिए एक लाइनर हां, तो मैं python3 में एक बनाने के लिए करने की कोशिश की तरह है: पी (अच्छा परिणाम लेकिन भयानक लग)

import functools 
timeList = ['0:00:00','0:00:15','9:30:56','21:00:00'] # notice additional 21 hours! 
sum_fnc=lambda ttt:(lambda a:'%02d:%02d:%02d' % (divmod(divmod(a,60)[0],60)+(divmod(a,60)[1],)))((lambda a:functools.reduce(lambda x,y:x+y[0]*3600+y[1]*60+y[2],a,0))((lambda a:[list(map(int,i.split()[-1].split(':'))) for i in a])(ttt))) 
# sum_fnc(timeList) -> '30:40:11' 
8

timedeltas का उपयोग करना (अजगर 3.4 में परीक्षण किया गया):

import datetime 

timeList = ['0:00:00', '0:00:15', '9:30:56'] 
sum = datetime.timedelta() 
for i in timeList: 
    (h, m, s) = i.split(':') 
    d = datetime.timedelta(hours=int(h), minutes=int(m), seconds=int(s)) 
    sum += d 
print(str(sum)) 

परिणाम:

9:31:11 
+0

2.7 में भी काम करता है। +1 क्योंकि कोड पठनीय और सहज है – adelval

0

Bellow को कम करने और सूची समझ का उपयोग कर एक समाधान है:

from functools import reduce 
from datetime import timedelta 

time_list = ['0:00:00', '0:00:15', '9:30:56'] 

total = reduce(lambda x, y: x + y, 
     [timedelta(hours=int(ms[0]), minutes=int(ms[1]), seconds=int(ms[2])) 
      for t in time_list 
       for ms in [t.split(':')]]) 

print(f'Total time: {total}') 

कुल समय: 9:31:11

संबंधित मुद्दे