पायथन में, आप `डेटाइम` ऑब्जेक्ट को सेकंड में कैसे परिवर्तित करते हैं?


226

सरल प्रश्न के लिए क्षमा याचना ... मैं पायथन के लिए नया हूं ... मैंने आसपास खोज की है और कुछ भी काम नहीं कर रहा है।

मेरे पास डेटाइम ऑब्जेक्ट्स का एक गुच्छा है और मैं प्रत्येक एक के लिए अतीत में एक निश्चित समय से सेकंड की संख्या की गणना करना चाहता हूं (उदाहरण के लिए 1 जनवरी, 1970 के बाद से)।

import datetime
t = datetime.datetime(2009, 10, 21, 0, 0)

ऐसा लगता है कि केवल उन तिथियों में अंतर है जो अलग-अलग दिन हैं:

t.toordinal()

किसी भी प्रकार की मदद की बेहद सराहना की जाती है।



2
मैं शायद दोनों को S से युग में परिवर्तित कर int(t.timestamp())
दूंगा

जवाबों:


233

1 जनवरी, 1970 की विशेष तिथि के लिए, कई विकल्प हैं।

किसी भी अन्य प्रारंभिक तिथि के लिए आपको सेकंड में दो तिथियों के बीच अंतर प्राप्त करना होगा। दो तिथियों को घटाना एक timedeltaवस्तु देता है , जैसा कि पायथन 2.7 में एक total_seconds()फ़ंक्शन है।

>>> (t-datetime.datetime(1970,1,1)).total_seconds()
1256083200.0

प्रारंभिक तिथि आमतौर पर यूटीसी में निर्दिष्ट की जाती है, इसलिए उचित परिणाम के लिए datetimeआप इस फॉर्मूले में फीड करें यूटीसी में भी होना चाहिए। यदि आपका datetimeUTC पहले से ही नहीं है, तो आपको इसका उपयोग करने से पहले इसे बदलना होगा, या tzinfoउचित ऑफसेट वाले वर्ग को संलग्न करना होगा ।

जैसा कि टिप्पणियों में उल्लेख किया गया है, यदि आपके पास एक tzinfoसंलग्न है datetimeतो आपको शुरुआती तिथि पर एक की आवश्यकता होगी या घटाव विफल हो जाएगा; ऊपर दिए गए उदाहरण के लिए, tzinfo=pytz.utcअगर मैं पायथन 2 का उपयोग कर रहा हूँ या tzinfo=timezone.utcयदि पायथन 3 का उपयोग कर रहा हूँ।


1
अजगर अब मुझे चेतावनी देता है: "टाइपर्रर: ऑफ़सेट-भोले और ऑफसेट-अवगत डेटाटाइम को घटाया नहीं जा सकता है" इसे ठीक करने के लिए सबसे अच्छा समाधान क्या है?
हारून ऐश

2
@Charybdis, कोशिश करें datetime.datetime(1970,1,1,tzinfo=pytz.utc)
मार्क रैनसम

9
उपयोग करने पर विचार करें: datetime.datetime.utcfromtimestamp(0) मैंने 'युग' को आसानी से प्राप्त करने के लिए इसका उपयोग किया है। ध्यान दें कि सभी प्रणालियों पर युग हमेशा एक जैसा नहीं होता है।
DA

3
यहां टाइमज़ोन के साथ बहुत सावधान रहें। मैं UTC + 2 पर हूं, जिसका अर्थ है कि 7200 सेकंड से इसका आउटपुट time.time()और datetime.now() - datetime(1970, 1, 1)अंतर। बल्कि उपयोग करें (t - datetime.datetime.fromtimestamp(0)).total_seconds()। करो नहीं का उपयोग utcfromtimestamp(0)करता है, तो आप अपने स्थानीय समय क्षेत्र में एक datetime परिवर्तित करना चाहते हैं।
कार्ल

2
@DA: पायथन नॉन-पोसिक्स युगों का समर्थन नहीं करता है । सभी सिस्टम जहां अजगर काम करता है वही
एपोच का

130

यूनिक्स समय पाने के लिए (1 जनवरी, 1970 से सेकंड)

>>> import datetime, time
>>> t = datetime.datetime(2011, 10, 21, 0, 0)
>>> time.mktime(t.timetuple())
1319148000.0

22
समय का उपयोग करते समय सावधान रहें। यह स्थानीय समय की अभिव्यक्ति के लिए है और यह प्लेटफॉर्म पर निर्भर है
शिह-वेन सु

7
वास्तव में सावधान रहें। यह मुझे मेरे गधे को बड़ा समय देता है
Arg

यह मानता है कि tस्थानीय समय है। स्थानीय टाइमज़ोन के लिए UTC ऑफ़सेट अतीत में अलग हो सकता है और यदि mktime()(C लाइब्रेरी) किसी दिए गए प्लेटफ़ॉर्म पर ऐतिहासिक टाइमज़ोन डेटा तक पहुंच नहीं है, तो यह विफल हो सकता है ( pytztz डेटाबेस तक पहुंचने का एक पोर्टेबल तरीका है)। इसके अलावा, स्थानीय समय डीएसटी संक्रमण के दौरान अस्पष्ट जैसे, हो सकता है - आप को स्पष्ट करने के लिए अतिरिक्त जानकारी की आवश्यकता है , जैसे अगर आपको लगता है कि लगातार तिथि जान / समय मान एक लॉग फ़ाइल में वृद्धि हो रही किया जाना चाहिए
JFS

1
ऐसे समय का उपयोग करें जब एक सेकंड के अंशों के साथ सावधान रहें। time.mktime(datetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timetuple())परिणाम 1564819506.0, चुपचाप मिलीसेकंड छोड़ने, लेकिन datetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timestamp()(Andrzej Pronobis 'जवाब) में परिणाम 1564819506.912, अपेक्षित परिणाम।
एलेक्स

128

पायथन 3.3 से शुरू यह datetime.timestamp()विधि के साथ सुपर आसान हो जाता है । यह पाठ्यक्रम केवल तभी उपयोगी होगा जब आपको 1970-01-01 UTC से सेकंड की संख्या की आवश्यकता होगी।

from datetime import datetime
dt = datetime.today()  # Get timezone naive now
seconds = dt.timestamp()

वापसी मूल्य एक सेकंड के अंशों का प्रतिनिधित्व करने वाला एक फ्लोट होगा। यदि डेटाइम टाइमजोन भोली है (जैसा कि ऊपर दिए गए उदाहरण में है), तो यह माना जाएगा कि डेटाइम टाइम स्थानीय समय का प्रतिनिधित्व करता है, अर्थात यह आपके वर्तमान स्थान से 1970-01-01 UTC तक सेकंड की संख्या होगी।


3
जो किसी ने भी इसे ठुकराया, क्या आप उसे समझा सकते हैं कि क्यों?
आंद्रेज प्रोनोबिस

5
मुझे लगता है, सवाल पर अजगर -२.० टैग के कारण डाउनवोट है (यह सिर्फ एक अनुमान है)।
JFS

3
यह स्वीकृत उत्तर होना चाहिए / स्वीकृत उत्तर तदनुसार अद्यतन किया जाना चाहिए।
ड्रीमफ्लैशर

11
मेरे अनुमान को अपग्रेड करने का समय;)
ड्रीमफ्लैशर

एक और प्रारंभिक तिथि से इस दूरी की गणना करना संभव है? (मैं
1970-01-01 की

29

शायद ऑफ-द-टॉपिक: डेटाइम से UNIX / POSIX समय प्राप्त करने और इसे वापस बदलने के लिए:

>>> import datetime, time
>>> dt = datetime.datetime(2011, 10, 21, 0, 0)
>>> s = time.mktime(dt.timetuple())
>>> s
1319148000.0

# and back
>>> datetime.datetime.fromtimestamp(s)
datetime.datetime(2011, 10, 21, 0, 0)

ध्यान दें कि विभिन्न टाइमज़ोन के परिणामों पर प्रभाव पड़ता है, उदाहरण के लिए मेरे वर्तमान TZ / DST रिटर्न:

>>>  time.mktime(datetime.datetime(1970, 1, 1, 0, 0).timetuple())
-3600 # -1h

इसलिए किसी को यूटीसी कार्यों के यूटीसी संस्करणों का उपयोग करके इसे सामान्य करने पर विचार करना चाहिए।

ध्यान दें कि पिछले परिणाम का उपयोग आपके वर्तमान समयक्षेत्र के यूटीसी ऑफसेट की गणना के लिए किया जा सकता है। इस उदाहरण में यह + 1 h है, अर्थात UTC + 0100।

संदर्भ:


mktime()विफल हो सकता है । सामान्य तौर पर, आपको pytzPOSIX टाइमस्टैम्प प्राप्त करने के लिए, स्थानीय समय को utc में बदलने की आवश्यकता होती है।
JFS

calendar.timegm () की time.mktime () यूटीसी संस्करण प्रतीत हो रहा है
frankster

27

int (t.strftime("%s")) भी काम करता है


1
पायथन 2.7 में मेरे लिए काम करता है, import datetime; t = datetime.datetime(2011, 10, 21, 0, 0)(ओपी द्वारा निर्दिष्ट)। लेकिन वास्तव में, मुझे संदेह है कि% s हाल ही में जोड़ा गया समय प्रारूप है।
dan3

1
@ dan3: गलत। %sसमर्थित नहीं है (यह कुछ प्लेटफार्मों पर काम कर सकता है tयदि स्थानीय समय का प्रतिनिधित्व करने वाला एक भोली-भाली वस्तु है और यदि स्थानीय सी लाइब्रेरी में tz डेटाबेस तक पहुंच है, तो परिणाम गलत हो सकता है)। इसका उपयोग न करें।
जफ

%sकहीं भी प्रलेखित नहीं है। मैं इसे वास्तविक कोड में बोता हूं और सोच रहा था कि यह क्या है और प्रलेखन में देखो और ऐसी कोई चीज नहीं है %s। केवल सेकंड के लिए केवल बड़े एस के साथ है।
वीस्टॉयकोव

13

अजगर डॉक्स से:

timedelta.total_seconds()

अवधि में निहित सेकंड की कुल संख्या लौटाएं। के बराबर

(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6

सच विभाजन सक्षम के साथ गणना की।

ध्यान दें कि बहुत बड़े समय अंतराल (अधिकांश प्लेटफार्मों पर 270 से अधिक वर्षों) के लिए यह विधि माइक्रोसेकंड सटीकता खो देगी।

वर्जन 2.7 में यह कार्यक्षमता नई है।


1
गणना के साथ एक छोटी सी समस्या है यह 10 * 6 के बजाय 10 6 होना चाहिए ... td.microseconds + (td.seconds + td.days * 24 * 3600) * 10 6) / 10 ** 6
ss

@sdu शानदार कैच - डबल तारांकन मेरे जवाब में है लेकिन स्टैकओवरफ्लो इसे खा जाता है, केवल पाठ को सुधारने का प्रयास करता है।
माइकल

2

UTC में POSIX टाइमस्टैम्प में समय का प्रतिनिधित्व करने वाली डेटाटाइम ऑब्जेक्ट को परिवर्तित करने के लिए :

from datetime import timezone

seconds_since_epoch = utc_time.replace(tzinfo=timezone.utc).timestamp()

POSIX टाइमस्टैम्प में स्थानीय टाइमज़ोन में समय का प्रतिनिधित्व करने वाली डेटाटाइम ऑब्जेक्ट को परिवर्तित करने के लिए:

import tzlocal # $ pip install tzlocal

local_timezone = tzlocal.get_localzone()
seconds_since_epoch = local_timezone.localize(local_time, is_dst=None).timestamp()

देखें कि मैं पायथन में स्थानीय समय को यूटीसी में कैसे परिवर्तित करूं? यदि tz डेटाबेस किसी दिए गए प्लेटफॉर्म पर उपलब्ध है; एक stdlib- केवल समाधान काम कर सकता है

यदि आपको <3.3पायथन संस्करणों के लिए समाधान की आवश्यकता हो तो लिंक का पालन करें ।


1

मैंने मानक लाइब्रेरी के Calendar.timegm की कोशिश की और यह काफी अच्छी तरह से काम करता है:

# convert a datetime to milliseconds since Epoch
def datetime_to_utc_milliseconds(aDateTime):
    return int(calendar.timegm(aDateTime.timetuple())*1000)

संदर्भ: https://docs.python.org/2/library/calendar.html#calendar.timegm


यह एक सेकंड के भिन्न स्ट्रिप्स। यह मानता है कि aDateTimeएक UTC समय है
JFS
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.