पायथन में टाइमस्टैम्प के लिए स्ट्रिंग दिनांक परिवर्तित करें


219

प्रारूप में एक स्ट्रिंग "%d/%m/%Y"को टाइमस्टैम्प में कैसे बदलें?

"01/12/2011" -> 1322697600

2 नंबर क्या है? यूनिक्स युग समय?
हस्तेउर

4
@ हस्तेउर, हाँ। दूसरा नंबर यूनिक्स युग की शुरुआत और निर्दिष्ट तारीख के बीच पारित सेकंड की संख्या का प्रतिनिधित्व करता है। इस प्रारूप को POSIX समय भी कहा जाता है।
इकोनोमेगा

जवाबों:


317
>>> import time
>>> import datetime
>>> s = "01/12/2011"
>>> time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple())
1322697600.0

10
यह स्थानीय समयक्षेत्र में मध्यरात्रि 01/12/2011 को ग्रहण करता है। यदि इनपुट यूटीसी में है; आप इस्तेमाल कर सकते हैं calendar.timegm()या.toordinal()
JFS

50
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()थोड़ा छोटा है
टाइमडिएल्स

11
@timdiels: फिर से। यदि स्पष्ट समय-सीमा नहीं दी गई है, तो यूटीसी के बजाय स्थानीय समय .timestamp()मान लेता है। उत्तर में कोड काम करता है (अपेक्षित उत्पादन करता है ) केवल एक कंप्यूटर पर जहां स्थानीय समय क्षेत्र शून्य utc ऑफसेट है। 1322697600
JFS

7
यह काम नहीं करता है: datetime.datetime.strptime ("2014: 06: 28 11:53:21", "% Y:% m:% d% H:% M:% S")। टाइमस्टैम्प () ट्रैसबैक। सबसे हाल की कॉल अंतिम): फ़ाइल "<stdin>", पंक्ति 1, में <मॉड्यूल>
विशेषताऐं

5
@ZdenekMaxa datetime.timestamp () केवल अजगर> = 3.3 संस्करणों के लिए उपलब्ध है। docs.python.org/3/whatsnew/3.3.html
joni jones

48

मैं उपयोग करता हूं ciso8601, जो डेटाइम के स्ट्रैप्टाइम की तुलना में 62x तेज है।

t = "01/12/2011"
ts = ciso8601.parse_datetime(t)
# to get time in seconds:
time.mktime(ts.timetuple())

आप यहां और जान सकते हैं ।


2
यह एक शानदार सुझाव है। मैंने अभी इसका इस्तेमाल किया और अपने निष्पादन से समय के TONS का मुंडन किया।
डेविड

3
मेरा भगवान यह तेज़ है
Hews

3
और +1 मुझे समय स्ट्रिंग प्रारूप क्या है यह बताने की आवश्यकता नहीं है।
ग्वेनफैवर

40

स्ट्रिंग को दिनांक ऑब्जेक्ट में बदलने के लिए:

from datetime import date, datetime

date_string = "01/12/2011"
date_object = date(*map(int, reversed(date_string.split("/"))))
assert date_object == datetime.strptime(date_string, "%d/%m/%Y").date()

POSIX टाइमस्टैम्प में दिनांक ऑब्जेक्ट को परिवर्तित करने का तरीका टाइमज़ोन पर निर्भर करता है। पाइथन में UTC टाइमस्टैम्प में परिवर्तित datetime.dateहोने से :

  • UTC में मध्यरात्रि वस्तु का प्रतिनिधित्व करता है

    import calendar
    
    timestamp1 = calendar.timegm(utc_date.timetuple())
    timestamp2 = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * 24*60*60
    assert timestamp1 == timestamp2
  • दिनांक वस्तु स्थानीय समय में मध्यरात्रि का प्रतिनिधित्व करती है

    import time
    
    timestamp3 = time.mktime(local_date.timetuple())
    assert timestamp3 != timestamp1 or (time.gmtime() == time.localtime())

UTC में मध्यरात्रि तक और जब भी स्थानीय समय हो, टाइमस्टैम्प अलग हैं।


जब मैं इस पोस्ट में उदाहरण चलाने के लिए, मैं त्रुटि मिलती है: NameError: name 'wckCalendar' is not defined। मैं विंडोज 32 बिट्स मशीन पर पायथन 3.4.1 चला रहा हूं। कोई उपाय? धन्यवाद।
sedeh

1
@sedeh पोस्ट में कोई wckCalendar नहीं है। अपना कोड जांचें।
JFS

@JFSebastian बिल्कुल, और मैं सीधे wCCalendar को कॉल करने की कोशिश नहीं कर रहा था। यह सिर्फ त्रुटि संदेश में दिखाई देता है। समस्या पर चर्चा करने वाली मेरी पोस्ट यहाँ देखें ।
sedeh

1
@ törzsmókus: यदि उत्तर गलत है, तो इससे कोई फर्क नहीं पड़ता कि यह कितना पठनीय है।
jfs

1
@ törzsmókus: मेरे उत्तर को देखें: यह दो अलग-अलग संख्याओं का उत्पादन कर सकता है । आपका जवाब बिना किसी का उल्लेख किए एक नंबर का उत्पादन करता है ।
jfs


21

उत्तर आपके इनपुट की तारीख के समय पर भी निर्भर करता है। यदि आपकी तारीख स्थानीय तारीख है, तो आप kkrielalex की तरह mktime () का उपयोग कर सकते हैं - केवल मैं यह नहीं देखता कि उसने इस छोटे संस्करण के बजाय डेटाइम का उपयोग क्यों किया:

>>> time.mktime(time.strptime('01/12/2011', "%d/%m/%Y"))
1322694000.0

लेकिन निरीक्षण करें कि मेरा परिणाम उसकी तुलना में अलग है, जैसा कि मैं शायद एक अलग टीबी में हूं (और परिणाम टाइमजोन मुक्त यूनिक्स परीक्षा है)

अब यदि इनपुट दिनांक UTC में पहले से है, तो मेरा मानना ​​है कि सही समाधान है:

>>> calendar.timegm(time.strptime('01/12/2011', '%d/%m/%Y'))
1322697600

मुझे लगता है कि यह बेहतर है। 'समय' और 'डेटाइम' दोनों को आयात करने की आवश्यकता नहीं है।
kennut

17

बस उपयोग करें datetime.datetime.strptime:

import datetime
stime = "01/12/2011"
print(datetime.datetime.strptime(stime, "%d/%m/%Y").timestamp())

परिणाम:

1322697600

स्थानीय समय क्षेत्र के उपयोग के बजाय UTC का उपयोग करने के लिए .replace:

datetime.datetime.strptime(stime, "%d/%m/%Y").replace(tzinfo=datetime.timezone.utc).timestamp()

पूरी तरह से awser के लिए आपको कहना होगा कि यह केवल अजगर के लिए वैध है 3.3+
एडुआर्डो

पहले उदाहरण पर, परिणाम एक floatनहीं हैint
Convid19

6

सबसे पहले आपको स्ट्रिंग को एक स्ट्रक्चर_टाइम फॉर्मेट में बदलने के लिए स्ट्रैटेम क्लास होना चाहिए ।

तो बस अपने फ्लोट प्राप्त करने के लिए वहाँ से mktime का उपयोग करें।


6

इनमें से बहुत सारे उत्तर इस बात पर विचार करने की जहमत नहीं उठाते हैं कि यह तिथि शुरू होने के लिए भोली है

सही होने के लिए, आपको पहले भोले को एक समय-सीमा के बारे में जागरूक डेटाइम बनाने की आवश्यकता है

import datetime
import pytz
# naive datetime
d = datetime.datetime.strptime('01/12/2011', '%d/%m/%Y')
>>> datetime.datetime(2011, 12, 1, 0, 0)

# add proper timezone
pst = pytz.timezone('America/Los_Angeles')
d = pst.localize(d)
>>> datetime.datetime(2011, 12, 1, 0, 0,
tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>)

# convert to UTC timezone
utc = pytz.UTC
d = d.astimezone(utc)
>>> datetime.datetime(2011, 12, 1, 8, 0, tzinfo=<UTC>)

# epoch is the beginning of time in the UTC timestamp world
epoch = datetime.datetime(1970,1,1,0,0,0,tzinfo=pytz.UTC)
>>> datetime.datetime(1970, 1, 1, 0, 0, tzinfo=<UTC>)

# get the total second difference
ts = (d - epoch).total_seconds()
>>> 1322726400.0

इसके अलावा:

सावधान रहें, का उपयोग कर pytzके लिए tzinfoएक में datetime.datetimeकई समय क्षेत्रों के लिए यह नहीं है कि काम। Pytz टाइमज़ोन के साथ डेटाटाइम देखें । अलग ऑफसेट कैसे tzinfo सेट है पर निर्भर करता है

# Don't do this:
d = datetime.datetime(2011, 12, 1,0,0,0, tzinfo=pytz.timezone('America/Los_Angeles'))
>>> datetime.datetime(2011, 1, 12, 0, 0, 
tzinfo=<DstTzInfo 'America/Los_Angeles' LMT-1 day, 16:07:00 STD>)
# tzinfo in not PST but LMT here, with a 7min offset !!!

# when converting to UTC:
d = d.astimezone(pytz.UTC)
>>> datetime.datetime(2011, 1, 12, 7, 53, tzinfo=<UTC>)
# you end up with an offset

https://en.wikipedia.org/wiki/Local_mean_time


6

मैं तिथि निर्धारण का सुझाव दूंगा :

import dateutil.parser
dateutil.parser.parse("01/12/2011", dayfirst=True).timestamp()

यह गलत है। ओपी "%d/%m/%Y"प्रारूप में समय की अपेक्षा करता है । तुलना करें: dateutil.parser.parse("01/02/2001")औरdatetime.strptime("01/02/2001", "%d/%m/%Y")
jfs

धन्यवाद @jfs, अच्छी पकड़। मैंने उसी हिसाब से अपना जवाब अपडेट किया। (एक गैर-अमेरिकी के रूप में, मैंने नहीं सोचा होगा कि अतार्किक M / D / Y प्रारूप पार्सर के लिए डिफ़ॉल्ट था।)
törzsmókus

1
यह 1322697600तब तक अपेक्षित नहीं है जब तक आपका स्थानीय समय UTC नहीं होता। देखें 2014 से मेरी टिप्पणी
JFS

4

काफी कुशल लगता है:

import datetime
day, month, year = '01/12/2011'.split('/')
datetime.datetime(int(year), int(month), int(day)).timestamp()

1.61 means µ 120 ns प्रति लूप (मतलब। एसटीडी। 7 रन का देव, प्रत्येक 100000 लूप)


क्या datetimeकार्य है? पुस्तकालय datetimeसे datetimeसमर्थन नहीं करता है.timestamp()
जूएई

@ जोये: यह पायथन 3.3 या बाद में करता है । जब प्रश्न पोस्ट किया गया था, लेकिन इसके बारे में 2012 सितंबर के बाद उपलब्ध हो गया है उपलब्ध नहीं था
ShadowRanger

0

बस datetime.timestamp (अपने डेटाटाइम इंस्टेंसे) का उपयोग करें, डेटाटाइम उदाहरण में टाइमज़ोन इन्फोमेशन होता है, इसलिए टाइमस्टैम्प एक मानक utc टाइमस्टैम्प होगा। यदि आप डेटाटाइम को टाइम टेबल में बदल देते हैं, तो यह टाइमज़ोन खो देगा, इसलिए परिणाम त्रुटि होगा। यदि आप एक इंटरफ़ेस प्रदान करना चाहते हैं, तो आपको इस तरह लिखना चाहिए: int (datetime.timestamp (time_instance)) * 1000


0

आप समय क्षेत्र के साथ किसी भी प्रारूप से दिनांक परिवर्तित करने के लिए, strptimeफ़ंक्शन का उपयोग करने के लिए इस निम्नलिखित लिंक का उल्लेख कर सकते हैं datetime.datetime

https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior


0

आप isoformat में बदल सकते हैं

my_date = '2020/08/08'
my_date = my_date.replace('/','-') # just to adapte to your question
date_timestamp = datetime.datetime.fromisoformat(my_date).timestamp()

-1

एक साधारण कार्य UNIX युग को प्राप्त करने के लिए।

नोट : यह फ़ंक्शन मानता है कि इनपुट दिनांक समय UTC प्रारूप में है ( टिप्पणियों का संदर्भ लें )।

def utctimestamp(ts: str, DATETIME_FORMAT: str = "%d/%m/%Y"):
    import datetime, calendar
    ts = datetime.datetime.utcnow() if ts is None else datetime.datetime.strptime(ts, DATETIME_FORMAT)
    return calendar.timegm(ts.utctimetuple())

उपयोग :

>>> utctimestamp("01/12/2011")
1322697600
>>> utctimestamp("2011-12-01", "%Y-%m-%d")
1322697600
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.