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




datetime (14)

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

छोटा और सरल मुझे तारों के रूप में इस तरह की तारीखों की एक विशाल सूची मिली है:

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

मैं डेटाबेस में उचित डेटाटाइम फ़ील्ड में इन्हें वापस लाने जा रहा हूं, इसलिए मुझे उन्हें वास्तविक डेटाटाइम ऑब्जेक्ट्स में जादू करने की ज़रूरत है।

कोई मदद (भले ही यह सही दिशा में सिर्फ एक किक है) की सराहना की जाएगी।

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


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

strptime ऑब्जेक्ट = strptime स्ट्रिंग

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

Jun 1 2005 1:33PM

बराबर है

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

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

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

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

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

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

% पी लोकेल के बराबर एएम या पीएम (पीएम)

तो आपको स्ट्रेटटाइम यानी 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)]

datetime पायथन मॉड्यूल दिनांक प्राप्त करने के लिए अच्छा है और दिनांक समय प्रारूपों को परिवर्तित करता है।

import datetime

new_date_format1 = datetime.datetime.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')
new_date_format2 = datetime.datetime.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p').strftime('%Y/%m/%d %I:%M%p')
print new_date_format1
print new_date_format2

आउटपुट:

2005-06-01 13:33:00
2005/06/01 01:33PM

मैंने एक परियोजना को एक साथ रखा है जो कुछ वास्तव में साफ अभिव्यक्तियों को परिवर्तित कर सकता है। 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))

मैं व्यक्तिगत रूप से parser मॉड्यूल का उपयोग करके समाधान पसंद करता हूं, जो इस प्रश्न का दूसरा उत्तर है और यह सुंदर है, क्योंकि आपको इसे काम करने के लिए किसी स्ट्रिंग 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

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


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

>>> 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/ देखें।


यदि आप केवल दिनांक प्रारूप चाहते हैं तो आप मैन्युअल रूप से इसे अपने व्यक्तिगत फ़ील्ड को पारित कर सकते हैं जैसे:

>>> 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]))

आपको डेट फॉर्मेट में परिणामी मान मिलेगा।


time मॉड्यूल में strptime देखें। यह strftime के विपरीत है।

$ python
>>> import 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)

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

पायथन 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)))

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)

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

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

मेरा जवाब देखें

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

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


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 महीने में फिर से खोजना नहीं होगा।

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

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"))​​​​​​​

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

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




datetime