स्ट्रिंग को डेटाइम में परिवर्तित करना


2178

मुझे तार के रूप में तारीख-बार की एक विशाल सूची मिली है:

Jun 1 2005  1:33PM
Aug 28 1999 12:00AM

मैं एक डेटाबेस में इन वापस उचित डेटाइम क्षेत्रों में shoving जा रहा हूँ ताकि मैं उन्हें वास्तविक डेटाटाइम ऑब्जेक्ट में जादू करने की आवश्यकता है।

यह Django के ORM के माध्यम से जा रहा है इसलिए मैं सम्मिलित करने पर SQL का उपयोग नहीं कर सकता।


6
जब तक आप सुनिश्चित न हों कि एक प्रारूप हर एक दिनांक-समय (कोई '', कोई NaNs, कोई अपूर्णता, कोई प्रारूप नहीं बेमेल है, कोई अनुगामी वर्ण, टाइमज़ोन, माइक्रोसेकंड टाइमस्टैम्प, या अन्य पाठ ...), अपवाद-खुशी नहीं संभालता है strptime()जब तक आप इसे लपेटते हैं, आपको पागल कर देगा। मेरा उत्तर देखें, या वीस के
smci

सबसे बड़ा, सबसे व्यापक रूप से प्रयोग करने योग्य दृष्टिकोण जो मुझे पता है वह है डेटपर (check blog.scrapinghub.com/2015/11/09/… )। यह बॉक्स के बाहर कई भाषाओं में प्राकृतिक भाषा के समय के भावों के साथ भी काम करता है। मुझे लगता है कि यह धीमा हो सकता है।
आर्मंडो

: यहाँ एक उपयोगी लिंक है stackabuse.com/converting-strings-to-datetime-in-python
GoingMyWay

जवाबों:


3456

datetime.strptimeडेटासेट में तार को पार्स करने का मुख्य रूटीन है। यह आपके द्वारा दिए गए प्रारूप स्ट्रिंग द्वारा निर्धारित प्रारूप के साथ सभी प्रकार के स्वरूपों को संभाल सकता है:

from datetime import datetime

datetime_object = datetime.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')

परिणामी datetimeवस्तु टाइमजोन-भोली है।

लिंक:

टिप्पणियाँ:

  • strptime = "स्ट्रिंग पार्स टाइम"
  • strftime = "स्ट्रिंग प्रारूप समय"
  • आज इसे जोर से उच्चारण करें और आपको 6 महीने में फिर से इसे खोजना नहीं पड़ेगा।

7
गैर-अंग्रेजी लोकेल में '% b', '% p' ​​विफल हो सकता है।
jfs

15
@User आप समय से आगे पता करने के लिए प्रारूप स्ट्रिंग के उस भाग को बाहर करने के लिए होगा, लेकिन आप एक चाहते हैं, तो dateएक के बजाय datetime, के माध्यम से जा datetimeअच्छी तरह से यह हैंडल: datetime.strptime('Jun 1 2005', '%b %d %Y').date() == date(2005, 6, 1)
Izkata

14
यदि आप जानते हैं कि स्ट्रिंग UTC में एक डेटाइम का प्रतिनिधित्व करती है, तो आप datetimeपायथन 3 में इस लाइन को जोड़कर एक from datetime import timezone; datetime_object = datetime_object.replace(tzinfo=timezone.utc)
टाइमज़ोन

111
मैं खोज रहा था"%Y-%m-%d %H:%M:%S"
मार्टिन थोमा

4
@AminahNuraini मुझे from datetime import datetimeबस के बजाय एक समान मुद्दे के आसपास मिला import datetime
मैक्स स्ट्रेटर

831

थर्ड पार्टी डेट्यूटिल लाइब्रेरी का उपयोग करें :

from dateutil import parser
parser.parse("Aug 28 1999 12:00AM")  # datetime.datetime(1999, 8, 28, 0, 0)

यह आप को पार्स करने के लिए आवश्यक सहित अधिकांश दिनांक स्वरूपों को संभाल सकता है। यह अधिक सुविधाजनक है strptimeक्योंकि यह अधिकांश समय सही प्रारूप का अनुमान लगा सकता है।

यह परीक्षण लिखने के लिए बहुत उपयोगी है, जहां प्रदर्शन की तुलना में पठनीयता अधिक महत्वपूर्ण है।

आप इसे स्थापित कर सकते हैं:

pip install python-dateutil

86
ध्यान रखें कि बड़ी डेटा राशियों के लिए यह समस्या का सबसे इष्टतम तरीका नहीं हो सकता है। हर बार प्रारूप का अनुमान लगाना बहुत ही धीमा हो सकता है।
पवेल पोलविक्ज़

14
यह अच्छा है, लेकिन ऐसा समाधान करना अच्छा होगा जो किसी थर्ड पार्टी में जाने के बजाय बिल्ट-इन हो।
ब्रायन बक

1
जब मैं "32 वें जन" को पार्स करने की कोशिश करता हूं, तो यह मुझे "2032-01-06" देता है .. जो कि गलत है। क्या यह जांचने का कोई तरीका है कि स्ट्रिंग एक वैध तिथि है या नहीं
कार्तिक डोमादिया

6
@ रीफ: मेरे त्वरित और गंदे बेंचमार्क के अनुसार 5 गुना धीमा। नहीं तो बुरी तरह के रूप में मैं उम्मीद होती है धीमी गति से।
एंटनी हैचकिंस

2
इसके अपने मुद्दे हैं - जैसे, उदाहरण के लिए, समय-समय पर चुपचाप समय क्षेत्र की जानकारी को छोड़ना: parser.parse ('15: 55EST ') को आज़माएं और parser.parse ('15 .55CST') के साथ तुलना करें
F1Mumors

490

समय मॉड्यूल में स्ट्रैप्टम देखें । यह स्ट्रैफ्टाइम का विलोम है ।

$ python
>>> import time
>>> my_time = time.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')
time.struct_time(tm_year=2005, tm_mon=6, tm_mday=1,
                 tm_hour=13, tm_min=33, tm_sec=0,
                 tm_wday=2, tm_yday=152, tm_isdst=-1)

timestamp = time.mktime(my_time)
# convert time object to datetime
from datetime import datetime
my_datetime = datetime.fromtimestamp(timestamp)
# convert time object to date
from datetime import date
my_date = date.fromtimestamp(timestamp)

16
जो मैं समझता हूं, यह उत्तर केवल समय वस्तुओं को आउटपुट करता है, न कि डेटाइम वस्तुओं को - जिसके कारण पैट्रिक के उत्तर की तुलना में उत्तर को दफन किया जाएगा।
अलेक्जेंडर बर्ड

क्या DateTimeField के डिफ़ॉल्ट डेटाइम प्रारूप को सेट करने का कोई तरीका है?
किंगपिन

3
जैसा कि अलेक्जेंडर ने कहा, यह एक संरचनात्मक रूप से लौटता है, डेटाइम नहीं। बेशक आप इसे एक डेटाइम में बदल सकते हैं, लेकिन अगर आप अंत में एक डेटटाइम ऑब्जेक्ट चाहते हैं तो पैट्रिक का जवाब अधिक सीधा है।
लिएंड्रो ने

मानक अजगर पुस्तकालय में स्ट्रेटोटाइम जैसा कुछ भी नहीं है, लेकिन डेटटाइल में एक पार्सर है जो बहुत सारे सर्वश्रेष्ठ प्रयास दिनांक प्रारूपों को पहचानता है।
ज्योफ गेरिएट ने

1
@BenBlank: '% b', '% p' ​​गैर-अंग्रेजी लोकेल में विफल हो सकता है।
jfs

113

मैंने एक परियोजना को एक साथ रखा है जो कुछ वास्तव में स्वच्छ अभिव्यक्तियों को बदल सकती है। की जाँच करें TIMESTRING

नीचे कुछ उदाहरण दिए गए हैं:

pip install timestring
>>> import timestring
>>> timestring.Date('monday, aug 15th 2015 at 8:40 pm')
<timestring.Date 2015-08-15 20:40:00 4491909392>
>>> timestring.Date('monday, aug 15th 2015 at 8:40 pm').date
datetime.datetime(2015, 8, 15, 20, 40)
>>> timestring.Range('next week')
<timestring.Range From 03/10/14 00:00:00 to 03/03/14 00:00:00 4496004880>
>>> (timestring.Range('next week').start.date, timestring.Range('next week').end.date)
(datetime.datetime(2014, 3, 10, 0, 0), datetime.datetime(2014, 3, 14, 0, 0))

2
वाह। वाह। वाह। वाह। यह इतना आसान है। मुझे एक डेटाइम स्ट्रिंग मिली है और मैं सिर्फ साल निकालना चाहता हूं। जैसा कि सरल: import timestring timestring.Date('27 Mar 2014 12:32:29 GMT').yearइस परिवाद ने इसे इतना आसान बना दिया! धन्यवाद।
ब्रैंडनजप

आपका स्वागत है। मैं इस पैकेज को बेहतर बनाने पर आपकी टिप्पणियों और विचारों को पसंद करूंगा। मुझे पता है, github मुद्दों का उपयोग करें। धन्यवाद!
स्टीव पीक

हाय स्टीव, मॉड्यूल महान है। एक कार्यदिवस स्ट्रिंग विशेषता के रूप में अच्छी तरह से करना अच्छा होगा। अन्यथा निश्चित नहीं है यदि आप सोमवार या रविवार से शुरू करते हैं
10

1
यह '5 फरवरी 2017' और '5 फरवरी 2017' को ठीक से परिवर्तित नहीं करता है (जो कुछ हलकों में लोकप्रिय स्वरूप हैं, और IMO स्पष्टता और पठनीयता के लिए कुछ सर्वश्रेष्ठ तारीख प्रारूप हैं)। यह उन्हें स्टोर करता है 2017-02-01। 5 / फरवरी / 2017 के लिए समान (यह फ़रवरी / 5/2017 सही ढंग से करता है, हालांकि); उन दोनों में से कोई भी अंतिम प्रारूप नहीं है जिसे मैंने कभी अपने ज्ञान के लिए इस्तेमाल किया है, लेकिन मैंने सोचा कि मैं इसे वैसे भी इंगित करूंगा।
Br --tsyorfuzthrāx

2
चेतावनी: ऐसा प्रतीत नहीं होता है कि यह पैकेज पिछले 5 वर्षों में किसी भी बिंदु पर बनाए रखा गया है या सुधरा हुआ है और नियमित रूप से पार्स स्पष्ट रूप से बेहतर तिथियों को दर्शाता है। उदाहरण के लिए, Date("20180912")किसी तरह तात्कालिकता एक मूल्य को पार कर जाती है 2018-11-21। अपने जोखिम पार इस्तेमाल करें।
bsplosion

54

इसे याद रखें और आपको फिर से डेटाइम रूपांतरण में भ्रमित होने की आवश्यकता नहीं है।

स्ट्रिंग टू डेटटाइम ऑब्जेक्ट = strptime

अन्य प्रारूपों के लिए डेटाटाइम ऑब्जेक्ट = strftime

Jun 1 2005 1:33PM

के बराबर है

%b %d %Y %I:%M%p

लोकेल के संक्षिप्त नाम (Jun) के रूप में% b महीना

महीने का% d दिन शून्य-गद्देदार दशमलव संख्या (1) के रूप में

दशमलव संख्या के रूप में शत प्रतिशत Y वर्ष (2015)

% I घंटा (12-घंटे की घड़ी) एक शून्य-पेड दशमलव संख्या (01) के रूप में

% M- शून्य-शून्य दशमलव संख्या के रूप में मिनट (33)

% p लोकेल का AM या PM (PM) दोनों के समकक्ष

इसलिए आपको स्ट्रैप्टम यानी कंवर्ट करने की जरूरत stringहै

>>> dates = []
>>> dates.append('Jun 1 2005  1:33PM')
>>> dates.append('Aug 28 1999 12:00AM')
>>> from datetime import datetime
>>> for d in dates:
...     date = datetime.strptime(d, '%b %d %Y %I:%M%p')
...     print type(date)
...     print date
... 

उत्पादन

<type 'datetime.datetime'>
2005-06-01 13:33:00
<type 'datetime.datetime'>
1999-08-28 00:00:00

क्या होगा अगर आपके पास तिथियों के अलग-अलग प्रारूप हैं, तो आप पांडा या dateutil.parse का उपयोग कर सकते हैं

>>> import dateutil
>>> dates = []
>>> dates.append('12 1 2017')
>>> dates.append('1 1 2017')
>>> dates.append('1 12 2017')
>>> dates.append('June 1 2017 1:30:00AM')
>>> [parser.parse(x) for x in dates]

उत्पादन

[datetime.datetime(2017, 12, 1, 0, 0), datetime.datetime(2017, 1, 1, 0, 0), datetime.datetime(2017, 1, 12, 0, 0), datetime.datetime(2017, 6, 1, 1, 30)]

दशमलव के रूप में सेकंड के लिए% S
आशावादी

1
%bयदि आप एक अंग्रेजी लोकेल नहीं है कि एक मशीन पर एक अंग्रेजी तारीख पार्स नहीं तोड़ा जाएगा ?
bfontaine

47

पायथन में = = 3.7.0,

परिवर्तित करने के लिए YYYY-MM-DD दिनांक वस्तु को स्ट्रिंग , datetime.fromisoformatइस्तेमाल किया जा सकता।

>>> from datetime import datetime

>>> date_string = "2012-12-12 10:10:10"
>>> print (datetime.fromisoformat(date_string))
>>> 2012-12-12 10:10:10

32

कई टाइमस्टैम्प में एक निहित समय क्षेत्र होता है। यह सुनिश्चित करने के लिए कि आपका कोड हर समयक्षेत्र में काम करेगा, आपको आंतरिक रूप से UTC का उपयोग करना चाहिए और हर बार जब कोई विदेशी वस्तु सिस्टम में प्रवेश करती है, तो एक समय-सीमा संलग्न करें।

पायथन 3.2+:

>>> datetime.datetime.strptime(
...     "March 5, 2014, 20:13:50", "%B %d, %Y, %H:%M:%S"
... ).replace(tzinfo=datetime.timezone(datetime.timedelta(hours=-3)))

3
mktime()यदि आप दूसरी विधि ( datetime.strptime()) जानते हैं तो आप बदसूरत और कभी-कभी गलत ( डीएसटी बदलाव के दौरान) पहली विधि क्यों रखते हैं? यदि आप एक लीप सेकंड के दौरान एक अपवाद से बचना चाहते हैं (दूसरा तरीका विफल हो जाता है) तो आप calendar.timegmइसके बजाय उपयोग कर सकते हैं :(datetime(1970,1,1)+timedelta(seconds=timegm(time.strptime(..)))).replace(tzinfo=timezone(timedelta(-3)))
jfs

29

यहाँ दो प्रकार के पंडों का उपयोग किया गया है जो डेटामेटेड डेट ऑब्जेक्ट्स में स्ट्रिंग्स के रूप में स्वरूपित डेट्स को परिवर्तित करते हैं।

import pandas as pd

dates = ['2015-12-25', '2015-12-26']

# 1) Use a list comprehension.
>>> [d.date() for d in pd.to_datetime(dates)]
[datetime.date(2015, 12, 25), datetime.date(2015, 12, 26)]

# 2) Convert the dates to a DatetimeIndex and extract the python dates.
>>> pd.DatetimeIndex(dates).date.tolist()
[datetime.date(2015, 12, 25), datetime.date(2015, 12, 26)]

समय

dates = pd.DatetimeIndex(start='2000-1-1', end='2010-1-1', freq='d').date.tolist()

>>> %timeit [d.date() for d in pd.to_datetime(dates)]
# 100 loops, best of 3: 3.11 ms per loop

>>> %timeit pd.DatetimeIndex(dates).date.tolist()
# 100 loops, best of 3: 6.85 ms per loop

और यहाँ ओपी की मूल तिथि-समय के उदाहरणों को परिवर्तित करना है:

datetimes = ['Jun 1 2005  1:33PM', 'Aug 28 1999 12:00AM']

>>> pd.to_datetime(datetimes).to_pydatetime().tolist()
[datetime.datetime(2005, 6, 1, 13, 33), 
 datetime.datetime(1999, 8, 28, 0, 0)]

उपयोग करने के लिए पंडों टाइमस्टैम्प्स को स्ट्रिंग्स से परिवर्तित करने के लिए कई विकल्प हैं to_datetime, इसलिए यदि आपको किसी विशेष चीज़ की आवश्यकता है तो डॉक्स की जांच करें ।

इसी तरह, टाइमस्टैम्प में कई गुण और विधियाँ हैं जिनके अलावा पहुँचा जा सकता है.date


26

मुझे व्यक्तिगत रूप से parserमॉड्यूल का उपयोग करके समाधान पसंद है , जो इस प्रश्न का दूसरा उत्तर है और सुंदर है, क्योंकि आपको इसे काम करने के लिए किसी भी स्ट्रिंग शाब्दिक का निर्माण नहीं करना है। लेकिन , एक नकारात्मक पक्ष यह है कि यह स्वीकृत उत्तर की तुलना में 90% धीमा है strptime

from dateutil import parser
from datetime import datetime
import timeit

def dt():
    dt = parser.parse("Jun 1 2005  1:33PM")
def strptime():
    datetime_object = datetime.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')

print(timeit.timeit(stmt=dt, number=10**5))
print(timeit.timeit(stmt=strptime, number=10**5))
>10.70296801342902
>1.3627995655316933

जब तक आप इसे बार-बार एक लाख बार नहीं कर रहे हैं , मुझे अभी भी लगता है कि parserविधि अधिक सुविधाजनक है और अधिकांश समय प्रारूपों को स्वचालित रूप से संभाल लेगी।


24

ऐसा कुछ जिसका उल्लेख यहां नहीं किया गया है और यह उपयोगी है: दिन में एक प्रत्यय जोड़ना। मैंने प्रत्यय तर्क को अयोग्य घोषित किया ताकि आप इसे किसी भी संख्या के लिए उपयोग कर सकें, न कि केवल तिथियों के लिए।

import time

def num_suffix(n):
    '''
    Returns the suffix for any given int
    '''
    suf = ('th','st', 'nd', 'rd')
    n = abs(n) # wise guy
    tens = int(str(n)[-2:])
    units = n % 10
    if tens > 10 and tens < 20:
        return suf[0] # teens with 'th'
    elif units <= 3:
        return suf[units]
    else:
        return suf[0] # 'th'

def day_suffix(t):
    '''
    Returns the suffix of the given struct_time day
    '''
    return num_suffix(t.tm_mday)

# Examples
print num_suffix(123)
print num_suffix(3431)
print num_suffix(1234)
print ''
print day_suffix(time.strptime("1 Dec 00", "%d %b %y"))
print day_suffix(time.strptime("2 Nov 01", "%d %b %y"))
print day_suffix(time.strptime("3 Oct 02", "%d %b %y"))
print day_suffix(time.strptime("4 Sep 03", "%d %b %y"))
print day_suffix(time.strptime("13 Nov 90", "%d %b %y"))
print day_suffix(time.strptime("14 Oct 10", "%d %b %y"))​​​​​​​

17
In [34]: import datetime

In [35]: _now = datetime.datetime.now()

In [36]: _now
Out[36]: datetime.datetime(2016, 1, 19, 9, 47, 0, 432000)

In [37]: print _now
2016-01-19 09:47:00.432000

In [38]: _parsed = datetime.datetime.strptime(str(_now),"%Y-%m-%d %H:%M:%S.%f")

In [39]: _parsed
Out[39]: datetime.datetime(2016, 1, 19, 9, 47, 0, 432000)

In [40]: assert _now == _parsed

16

Django Timezone जागरूक डेटाइम ऑब्जेक्ट उदाहरण।

import datetime
from django.utils.timezone import get_current_timezone
tz = get_current_timezone()

format = '%b %d %Y %I:%M%p'
date_object = datetime.datetime.strptime('Jun 1 2005  1:33PM', format)
date_obj = tz.localize(date_object)

जब आपके पास यह रूपांतरण Django और पायथन के लिए बहुत महत्वपूर्ण है USE_TZ = True:

RuntimeWarning: DateTimeField MyModel.created received a naive datetime (2016-03-04 00:00:00) while time zone support is active.

12

एक छोटी उपयोगिता फ़ंक्शन बनाएं जैसे:

def date(datestr="", format="%Y-%m-%d"):
    from datetime import datetime
    if not datestr:
        return datetime.today().date()
    return datetime.strptime(datestr, format).date()

यह पर्याप्त बहुमुखी है:

  • यदि आप कोई तर्क पारित नहीं करते हैं तो यह आज की तारीख में वापस आ जाएगा।
  • डिफ़ॉल्ट रूप में एक दिनांक स्वरूप है जिसे आप ओवरराइड कर सकते हैं।
  • डेटटाइम वापस करने के लिए आप इसे आसानी से संशोधित कर सकते हैं।

2
formatअजगर में एक आरक्षित शब्द है और इसे एक चर नाम के रूप में उपयोग नहीं किया जाना चाहिए।
श्रेडिंग

12

यह स्ट्रिंग को डेटाइम में परिवर्तित करने के लिए सहायक होगा और समय क्षेत्र के साथ भी

def convert_string_to_time(date_string, timezone):
    from datetime import datetime
    import pytz
    date_time_obj = datetime.strptime(date_string[:26], '%Y-%m-%d %H:%M:%S.%f')
    date_time_obj_timezone = pytz.timezone(timezone).localize(date_time_obj)

    return date_time_obj_timezone

date = '2018-08-14 13:09:24.543953+00:00'
TIME_ZONE = 'UTC'
date_time_obj_timezone = convert_string_to_time(date, TIME_ZONE)

9

तीर दिनांक और समय के लिए कई उपयोगी कार्य प्रदान करता है। यह बिट कोड प्रश्न का उत्तर प्रदान करता है और दिखाता है कि तीर आसानी से तिथियों को प्रारूपित करने और अन्य स्थानों के लिए जानकारी प्रदर्शित करने में भी सक्षम है।

>>> import arrow
>>> dateStrings = [ 'Jun 1  2005 1:33PM', 'Aug 28 1999 12:00AM' ]
>>> for dateString in dateStrings:
...     dateString
...     arrow.get(dateString.replace('  ',' '), 'MMM D YYYY H:mmA').datetime
...     arrow.get(dateString.replace('  ',' '), 'MMM D YYYY H:mmA').format('ddd, Do MMM YYYY HH:mm')
...     arrow.get(dateString.replace('  ',' '), 'MMM D YYYY H:mmA').humanize(locale='de')
...
'Jun 1  2005 1:33PM'
datetime.datetime(2005, 6, 1, 13, 33, tzinfo=tzutc())
'Wed, 1st Jun 2005 13:33'
'vor 11 Jahren'
'Aug 28 1999 12:00AM'
datetime.datetime(1999, 8, 28, 0, 0, tzinfo=tzutc())
'Sat, 28th Aug 1999 00:00'
'vor 17 Jahren'

अधिक के लिए http://arrow.readthedocs.io/en/latest/ देखें ।


6

आप इसे आसान बनाने के लिए easy_date का उपयोग कर सकते हैं :

import date_converter
converted_date = date_converter.string_to_datetime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')

4

यदि आप केवल दिनांक प्रारूप चाहते हैं तो आप अपने व्यक्तिगत क्षेत्रों जैसे:

>>> import datetime
>>> date = datetime.date(int('2017'),int('12'),int('21'))
>>> date
datetime.date(2017, 12, 21)
>>> type(date)
<type 'datetime.date'>

इसे बदलने के लिए आप अपने विभाजन स्ट्रिंग मानों को पास कर सकते हैं जैसे:

selected_month_rec = '2017-09-01'
date_formate = datetime.date(int(selected_month_rec.split('-')[0]),int(selected_month_rec.split('-')[1]),int(selected_month_rec.split('-')[2]))

आपको परिणाम स्वरूप दिनांक स्वरूप मिलेगा।


2

आप भी देख सकते हैं dateparser

dateparser आमतौर पर वेब पृष्ठों पर पाए जाने वाले किसी भी स्ट्रिंग स्वरूपों में स्थानीय तारीखों को आसानी से पार्स करने के लिए मॉड्यूल प्रदान करता है।

इंस्टॉल:

$ pip install dateparser

यह है, मुझे लगता है, सबसे आसान तरीका है कि आप खजूर को पार्स कर सकते हैं।

सबसे सीधा तरीका dateparser.parseफ़ंक्शन का उपयोग करना है, जो मॉड्यूल में अधिकांश कार्यक्षमता के चारों ओर लपेटता है।

नमूना कोड:

import dateparser

t1 = 'Jun 1 2005  1:33PM'
t2 = 'Aug 28 1999 12:00AM'

dt1 = dateparser.parse(t1)
dt2 = dateparser.parse(t2)

print(dt1)
print(dt2)

आउटपुट:

2005-06-01 13:33:00
1999-08-28 00:00:00

1

मेरा जवाब देखिए ।

वास्तविक दुनिया के डेटा में यह एक वास्तविक समस्या है: एकाधिक, बेमेल, अपूर्ण, असंगत और बहुभाषी / क्षेत्र तिथि प्रारूप, अक्सर एक डेटासेट में स्वतंत्र रूप से मिश्रित होते हैं। उत्पादन कोड विफल होना ठीक नहीं है, अकेले लोमड़ी की तरह अपवाद-खुश जाना।

हमें प्रयास करने की आवश्यकता है ... एकाधिक डेटाटाइम स्वरूपों को पकड़ें fmt1, fmt2, ..., fmtn और strptime()उन सभी के लिए अपवादों को दबाएं / दबाएं (जो विशेष रूप से बेमेल हैं) और विशेष रूप से, कोशिश के एक yukky n- डीप इंडेंटेड सीढ़ी की आवश्यकता से बचें ..कचेज क्लॉस)। से मेरी समाधान

def try_strptime(s, fmts=['%d-%b-%y','%m/%d/%Y']):
    for fmt in fmts:
        try:
            return datetime.strptime(s, fmt)
        except:
            continue

    return None # or reraise the ValueError if no format matched, if you prefer

प्रश्न में कहा गया है कि "एकाधिक, बेमेल, अपूर्ण, असंगत और बहुभाषी / क्षेत्र तिथि प्रारूप" आदि के बारे में यह एक वास्तविक समस्या हो सकती है, लेकिन यहां प्रासंगिक नहीं है।
RoG

1
@RoG: यह कभी नहीं कहा कि वे नहीं थे, और यह निहित है कि वे थे: "विशाल सूची ... डेटाबेस" । अधिकांश डेटाबेस / लॉगफ़ाइल में मैंने (यहां तक ​​कि छोटे आकार के) पर काम किया है, कई दिनांक प्रारूप, टाइमज़ोन पहचानकर्ता, एमएम-डीडी आदि थे। उत्पादन में यह भंगुर कोड लिखने के लिए अस्वीकार्य है जो कि प्रारूपों में हार्डकोड और अपवाद के साथ क्रैश होता है। इसे वह प्रारूप प्राप्त नहीं होता है जिसकी अपेक्षा की जाती है (यहां तक ​​कि कोई भी नहीं लौट रहा है या '' अधिक स्वीकार्य है)। इसलिए कई स्वरूपों की आवश्यकता है। इसलिए यह पूछे गए प्रश्न को संबोधित करता है, और मैंने कई स्वरूपों से त्रुटियों को संभालने के लिए सबसे पायथोनिक तरीके का पता लगाने में थोड़ा समय बिताया।
smci

"विशाल सूची ... डेटाबेस" का तात्पर्य है कि उनमें से बहुत सारे हैं, न कि वे सभी अलग-अलग प्रारूप हैं। यह कोड लिखने के लिए पूरी तरह से स्वीकार्य है जो एकल प्रारूप को पढ़ता है, यदि आप जानते हैं कि इनपुट में एक ही प्रारूप है। इस मामले में यह दुर्घटनाग्रस्त हो जाना चाहिए अगर यह कुछ ऐसा है जो सही प्रारूप में नहीं है।
RoG

@ आरओजी: यह उत्पादन कोड लिखने के लिए अस्वीकार्य है जो गलत-प्रारूप / मैंगल्ड यूनिकोड / ट्रेंकेटेड / लापता / डेटा, NaNs, M / D / Y बनाम D / M / Y प्रारूप, YSY YYYY, आदि पर क्रैश होता है, विशेष रूप से यदि वे। अपवादों को सात-लाइनर समाधान से बचा जा सकता है जैसा मैंने दिखाया। अधिकांश वास्तविक दुनिया "विशाल डेटाबेस" इस तरह हैं। सिर्फ इसलिए कि ओपी ने स्पष्ट रूप से नहीं कहा कि इसका मतलब यह नहीं है कि यह विशिष्ट संदर्भ नहीं है। मैं तुम्हारे साथ नहीं जा रहा हूँ। आप किस तरह के डेटासेट पर काम करते हैं और आपको क्या लगता है कि ये धारणाएँ उचित हैं? जब तक हम केवल खिलौना कोड के बारे में बात कर रहे हैं जिसमें निरंतर हस्तक्षेप की आवश्यकता होती है।
एसएमसीआई

1
यह पूरी निश्चितता के साथ मानना ​​थोड़ा मूर्खतापूर्ण है कि ओपी के पास वह डेटा होना चाहिए जिसमें कभी विसंगतियां न हों। हाँ, इस तरह डेटा होना संभव है, लेकिन नहीं हम यह नहीं मान सकते कि यहाँ ऐसा ही है। मुझे लगा कि यह उत्तर उपयोगी था, निश्चित रूप से मेरे लिए जिनके समान प्रश्नों के समान उत्तरों की खोज की जा रही है, जहां विसंगतियां निश्चित रूप से एक मुद्दा है।
पॉल मिलर

1
emp = pd.read_csv("C:\\py\\programs\\pandas_2\\pandas\\employees.csv")
emp.info()

यह "स्टार्ट टाइम टाइम" कॉलम और "लास्ट लॉग इन टाइम" दिखाता है, दोनों डेटा-फ्रेम में "ऑब्जेक्ट = स्ट्रिंग्स" हैं

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 8 columns):
First Name           933 non-null object
Gender               855 non-null object
Start Date           1000 non-null object

Last Login Time      1000 non-null object
Salary               1000 non-null int64
Bonus %              1000 non-null float64
Senior Management    933 non-null object
Team                 957 non-null object
dtypes: float64(1), int64(1), object(6)
memory usage: 62.6+ KB

उल्लेख parse_datesमें विकल्प का उपयोग करके read_csvआप अपने स्ट्रिंग डेटाइम को पांडा डेटाटाइम प्रारूप में बदल सकते हैं।

emp = pd.read_csv("C:\\py\\programs\\pandas_2\\pandas\\employees.csv", parse_dates=["Start Date", "Last Login Time"])
emp.info()


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 8 columns):
First Name           933 non-null object
Gender               855 non-null object
Start Date           1000 non-null datetime64[ns]
Last Login Time      1000 non-null datetime64[ns]
Salary               1000 non-null int64
Bonus %              1000 non-null float64
Senior Management    933 non-null object
Team                 957 non-null object
dtypes: datetime64[ns](2), float64(1), int64(1), object(4)
memory usage: 62.6+ KB
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.