দুটি সময়ের স্ট্রিংয়ের মধ্যে সময়ের ব্যবধানকে কীভাবে গণনা করা যায়


169

10.33 (এইচএইচ: এমএম: এসএস) ফর্ম্যাটে আমার দু'বার, একটি শুরু এবং একটি স্টপ সময় রয়েছে। আমার দু'বারের মধ্যে পার্থক্য দরকার। আমি পাইথনের ডকুমেন্টেশনগুলি সন্ধান করছি এবং অনলাইনে অনুসন্ধান করছি এবং আমি কল্পনা করব যে এটির ডেটটাইম এবং / অথবা সময় মডিউলগুলির সাথে কিছু আছে। আমি এটি সঠিকভাবে কাজ করতে পারি না এবং কোনও তারিখের সাথে জড়িত থাকার সময় এটি কীভাবে করা যায় তা কেবল অনুসন্ধান করতেই থাকি।

শেষ পর্যন্ত, আমার একাধিক সময়ের সময়কালের গড় গণনা করা দরকার। আমি কাজের সময় পার্থক্য পেয়েছি এবং আমি তাদের একটি তালিকায় সংরক্ষণ করছি। আমার এখন গড় গণনা করা দরকার। আমি আসল সময়গুলি পার্স করার জন্য এবং তারপরে পার্থক্যগুলি করতে নিয়মিত এক্সপ্রেশন ব্যবহার করছি।

গড়ের জন্য, আমার কি সেকেন্ডে রূপান্তর করা উচিত এবং তারপরে গড়?


2
আপনি যে কোডটি চেষ্টা করেছেন তা কি আপনি পোস্ট করতে পারেন এবং আমরা সেখান থেকে শুরু করতে পারি?
অ্যান্টনি ফোরলনি

উত্তর:


200

হ্যাঁ, অবশ্যই datetimeএখানে আপনার যা প্রয়োজন। বিশেষত, strptimeফাংশন, যা একটি স্ট্রিংকে একটি সময় অবজেক্টে পার্স করে।

from datetime import datetime
s1 = '10:33:26'
s2 = '11:15:49' # for example
FMT = '%H:%M:%S'
tdelta = datetime.strptime(s2, FMT) - datetime.strptime(s1, FMT)

এটি আপনাকে এমন একটি timedeltaবস্তু দেয় যা দুটি সময়ের মধ্যে পার্থক্য রাখে। আপনি এটা সেকেন্ড রূপান্তর বা অন্য সাথে যোগ করে the, যাই হোক না কেন আপনি যে সঙ্গে চান করতে পারেন datetime

উদাহরণস্বরূপ s1 = 12:00:00এবং শেষ সময়টি শুরু সময়ের চেয়ে আগে হলে এটি একটি নেতিবাচক ফলাফল ফিরিয়ে দেবে s2 = 05:00:00। আপনি যদি কোডটি এই ক্ষেত্রে মধ্যরাতটি অতিক্রম করতে অনুমান করতে চান (তবে এটি ধরে নেওয়া উচিত যে শেষের সময়টি আরম্ভের সময়ের আগে কখনও হয় না), আপনি উপরের কোডটিতে নিম্নলিখিত লাইনগুলি যুক্ত করতে পারেন:

if tdelta.days < 0:
    tdelta = timedelta(days=0,
                seconds=tdelta.seconds, microseconds=tdelta.microseconds)

(অবশ্যই আপনি from datetime import timedeltaকোথাও অন্তর্ভুক্ত করা প্রয়োজন )। এই ব্যবহারের ক্ষেত্রে নির্দেশ করার জন্য জেএফ সেবাস্তিয়ানকে ধন্যবাদ।


days= -2নেডেটিভ টাইম হ্যাক টিডেল্টা অবজেক্টে কখন বা তার বেশি কাজ করবে না ।
সিকেএম

@ চন্দ্রাশ হ্যাঁ, তবে daysঅতিরিক্ত বর্ণিত তথ্য (বিশেষত তারিখগুলি) প্রশ্নের বাইরে বর্ণিত হওয়া ছাড়াই কখনও -2 বা তার চেয়ে কম হতে পারে না। সুতরাং সেই পরিস্থিতি এখানে প্রাসঙ্গিক নয়।
ডেভিড জেড

3
ইঙ্গিত: সেকেন্ডে সময় ডেল্টা পেতে আপনাকে কল করতে হবে tdelta.total_seconds()
স্কাই

156

এটি ব্যবহার করে দেখুন - স্বল্প-মেয়াদী ইভেন্টগুলির সময় নির্ধারণের জন্য এটি দক্ষ। যদি কোনও এক ঘন্টার বেশি সময় লাগে তবে চূড়ান্ত প্রদর্শনটি সম্ভবত কিছু বন্ধুত্বপূর্ণ ফর্ম্যাটিং চাইবে।

import time
start = time.time()

time.sleep(10)  # or do something more productive

done = time.time()
elapsed = done - start
print(elapsed)

সময়ের পার্থক্যটি বিগত সেকেন্ডের সংখ্যা হিসাবে ফিরে আসে।


5
কেন এটি গৃহীত উত্তর ছিল না? এটি সহজ, এটি এমন একটি মান দেয় যা কোনও কিছুর সাথে তুলনা করা যায় (আমার কমান্ডটি কার্যকর করতে 2.5 সেকেন্ডের বেশি সময় নিয়েছে?) এবং এটি v2.7 এ কাজ করে
মওগ বলেছেন মনিকা

11
@ মাওগ কারণ এটি ওপিএস প্রশ্নের উত্তর দেয় না। তিনি জিজ্ঞাসা করছিলেন যে কীভাবে তার কোডটিতে কোনও ইভেন্টের সময় নির্ধারণের মাধ্যমে সেগুলি তৈরি করা যায় তা নয়, ইতিমধ্যে একটি নির্দিষ্ট ফর্ম্যাটে থাকা দুটি ভিন্ন সময়ের সাথে কীভাবে তুলনা করা যায়। তারা বেশ ভিন্ন সমস্যা।
নটসুকনে

2
আপনার এটি ব্যবহার করা উচিত নয়; পরিবর্তে একঘেয়ে সময় ব্যবহার করুন ( time.monotonic()পাইথনে)। time.time()পিছনে যেতে পারে (যেমন, যখন এনটিপি সংশোধন সহ মেশিনে সময় পরিবর্তন হয়)।
nemequ

1
প্রশ্নে অপ্রাসঙ্গিক
প্যাট্রিক্টোকিফ

14

এখানে এমন একটি সমাধান রয়েছে যা শেষ সময় শুরুর চেয়ে কম সময় (মধ্যরাতের ব্যবধানে) যেমন 23:55:00-00:25:00(আধা ঘন্টা সময়কাল) থেকে পৃথক হবে:

#!/usr/bin/env python
from datetime import datetime, time as datetime_time, timedelta

def time_diff(start, end):
    if isinstance(start, datetime_time): # convert to datetime
        assert isinstance(end, datetime_time)
        start, end = [datetime.combine(datetime.min, t) for t in [start, end]]
    if start <= end: # e.g., 10:33:26-11:15:49
        return end - start
    else: # end < start e.g., 23:55:00-00:25:00
        end += timedelta(1) # +day
        assert end > start
        return end - start

for time_range in ['10:33:26-11:15:49', '23:55:00-00:25:00']:
    s, e = [datetime.strptime(t, '%H:%M:%S') for t in time_range.split('-')]
    print(time_diff(s, e))
    assert time_diff(s, e) == time_diff(s.time(), e.time())

আউটপুট

0:42:23
0:30:00

time_diff()একটি টাইমডেল্টা অবজেক্ট দেয় যা আপনি সরাসরি (ক্রমের অংশ হিসাবে) কোনও mean()ফাংশনে সরাসরি পাস করতে পারেন যেমন:

#!/usr/bin/env python
from datetime import timedelta

def mean(data, start=timedelta(0)):
    """Find arithmetic average."""
    return sum(data, start) / len(data)

data = [timedelta(minutes=42, seconds=23), # 0:42:23
        timedelta(minutes=30)] # 0:30:00
print(repr(mean(data)))
# -> datetime.timedelta(0, 2171, 500000) # days, seconds, microseconds

mean()ফলাফলের হয় timedelta()বস্তুর যে আপনার (সেকেন্ড রূপান্তর করতে পারেন td.total_seconds()(যেহেতু পাইথন 2.7) মেথড), ঘন্টা ( td / timedelta(hours=1)(পাইথন 3)), ইত্যাদি


@ জেএফ, আমি অবাক হয়েছি যে পরিসংখ্যানগুলির অর্থ এবং ভেরিয়েন্স ফাংশনগুলি এখন টাইমডেল্টা অবজেক্টের সাথে সরাসরি কাজ করে? কোন চিন্তা? এছাড়াও, টাইমডেল্টা অবজেক্টগুলির বৈকল্পিক গণনা করতে যে কোনও সহায়তা কার্যকর হবে।
সিকেএম

@ চন্দ্রাশ: এটি সমর্থিত নয়। টাইমডেল্টাসের গাণিতিক পরিসংখ্যান গণনা করার জন্য আপনি সেকেন্ড / মাইক্রোসেকেন্ডে রূপান্তর করতে পারেন।
jfs

11

কাঠামো যে পাইথনের সময়ের পার্থক্য উপস্থাপন করে তাকে টাইমডেল্টা বলে । আপনার মত start_timeএবং প্রকার end_timeহিসাবে datetimeআপনি যেমন -অপারেটর ব্যবহার করে পার্থক্যটি গণনা করতে পারেন:

diff = end_time - start_time

পার্টিক্যুলার স্ট্রিং ফর্ম্যাটে রূপান্তর করার আগে আপনার এটি করা উচিত (উদাঃ স্টার্ট_টাইম.স্টারটাইম (...)) এর আগে। যদি আপনার ইতিমধ্যে স্ট্রিং প্রতিনিধিত্ব থাকে তবে আপনাকে এন্টারপিটাইম পদ্ধতিটি ব্যবহার করে সময় / তারিখের সময়টিতে রূপান্তর করতে হবে ।


10

এই সাইটটি চেষ্টা করতে বলেছে:

import datetime as dt
start="09:35:23"
end="10:23:00"
start_dt = dt.datetime.strptime(start, '%H:%M:%S')
end_dt = dt.datetime.strptime(end, '%H:%M:%S')
diff = (end_dt - start_dt) 
diff.seconds/60 

এই ফোরাম সময়.মেকটাইম () ব্যবহার করে


আপনি যদি%% (AM / PM) ব্যবহার করেন যে আপনি% H (24 ঘন্টা) এর পরিবর্তে% I (12 ঘন্টা) ব্যবহার করেন তা নিশ্চিত করুন: ডকস.পিথন.আর.
অ্যান্ড্রু

6

এই লোকটি এটি কীভাবে করে তা আমি পছন্দ করি - https://amalgjose.com/2015/02/19/python-code-for-calculating-the-differences-between-two-time-stamps । নিশ্চিত না এটির কিছু কনস আছে কিনা।

তবে আমার জন্য ঝরঝরে লাগছে :)

from datetime import datetime
from dateutil.relativedelta import relativedelta

t_a = datetime.now()
t_b = datetime.now()

def diff(t_a, t_b):
    t_diff = relativedelta(t_b, t_a)  # later/end time comes first!
    return '{h}h {m}m {s}s'.format(h=t_diff.hours, m=t_diff.minutes, s=t_diff.seconds)

datetime.strptime()অন্যদের আগে যেমন বলেছিল তেমন প্রশ্ন সম্পর্কিত আপনাকে এখনও ব্যবহার করা দরকার ।


3

এটা চেষ্টা কর

import datetime
import time
start_time = datetime.datetime.now().time().strftime('%H:%M:%S')
time.sleep(5)
end_time = datetime.datetime.now().time().strftime('%H:%M:%S')
total_time=(datetime.datetime.strptime(end_time,'%H:%M:%S') - datetime.datetime.strptime(start_time,'%H:%M:%S'))
print total_time

আউটপুট:

0:00:05

এই উত্তরটির মূলটি ছয় বছরের পুরানো এবং উচ্চ উত্সাহিত গৃহীত উত্তর থেকে মোটেও আলাদা নয়। আপনার আসলে যুক্ত করার মতো কিছু আছে? সম্পূর্ণ অনর্থক উত্তর জমা দেওয়ার কোনও মানে নেই।
ব্ল্যাককিংহিট

2
import datetime as dt
from dateutil.relativedelta import relativedelta

start = "09:35:23"
end = "10:23:00"
start_dt = dt.datetime.strptime(start, "%H:%M:%S")
end_dt = dt.datetime.strptime(end, "%H:%M:%S")
timedelta_obj = relativedelta(start_dt, end_dt)
print(
    timedelta_obj.years,
    timedelta_obj.months,
    timedelta_obj.days,
    timedelta_obj.hours,
    timedelta_obj.minutes,
    timedelta_obj.seconds,
)

ফলাফল: 0 0 0 0 -47 -37


1

উভয় timeএবং datetimeএকটি তারিখ উপাদান আছে।

সাধারণত যদি আপনি কেবল সময়ের অংশ নিয়ে কাজ করে থাকেন তবে আপনি একটি ডিফল্ট তারিখ সরবরাহ করবেন। আপনি যদি কেবলমাত্র পার্থক্যের প্রতি আগ্রহী হন এবং উভয় সময় একই দিনে রয়েছে তা জানতে datetimeপারলে আজ নির্ধারিত দিনটির সাথে প্রত্যেকটির জন্য একটি তৈরি করুন এবং বিরতি ( timedelta) পেতে স্টপ সময় থেকে শুরুটি বিয়োগ করুন ।


1

ডেটটাইম মডিউল এবং টাইমডেল্টা অবজেক্টগুলি একবার দেখুন। আপনার শুরু এবং থামার সময়গুলির জন্য একটি ডেটটাইম অবজেক্টটি তৈরি করা উচিত এবং আপনি যখন এগুলি বিয়োগ করেন, আপনি একটি সময়সীমা পেলেন।


0

আপনি যদি 24 ঘন্টা কমের সময় অতিবাহিত সময়টিতে আগ্রহী হন তবে সংক্ষিপ্ত হন। আপনি রিটার্ন বিবৃতিতে প্রয়োজন হিসাবে আউটপুট ফর্ম্যাট করতে পারেন:

import datetime
def elapsed_interval(start,end):
    elapsed = end - start
    min,secs=divmod(elapsed.days * 86400 + elapsed.seconds, 60)
    hour, minutes = divmod(min, 60)
    return '%.2d:%.2d:%.2d' % (hour,minutes,secs)

if __name__ == '__main__':
    time_start=datetime.datetime.now()
    """ do your process """
    time_end=datetime.datetime.now()
    total_time=elapsed_interval(time_start,time_end)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.