अजगर में एक स्ट्रिंग से तारीख निकालना


82

मैं "बंदर 2010-07-10 प्यार केला" जैसे तार से तारीख कैसे निकाल सकता हूं? धन्यवाद!


3
बस एक संकेत: यह एक अंक के साथ शुरू और समाप्त होता है। मुझे इसके बारे में सोचने दें। हालांकि, रेगेक्स वहां आपका दोस्त हो सकता है।
हमीश ग्रुबीजन

जवाबों:


82

यदि तारीख निश्चित रूप में दी गई है, तो आप तारीख निकालने के लिए बस तारीख निकालने के लिए एक नियमित अभिव्यक्ति और "datetime.datetime.strptime" का उपयोग कर सकते हैं:

import re
from datetime import datetime

match = re.search(r'\d{4}-\d{2}-\d{2}', text)
date = datetime.strptime(match.group(), '%Y-%m-%d').date()

अन्यथा, यदि तिथि एक मनमाने रूप में दी जाती है, तो आप इसे आसानी से नहीं निकाल सकते।


1
क्या होगा यदि यह यूरोपीय प्रारूप में है, जैसे 20/01/1980 का अर्थ "20 जनवरी 1980"? क्या होगा अगर महीने / दिन / साल उचित सीमा के बाहर आते हैं?
हामिश ग्रुबीजान

@lunaryorn पहले कथन में "पुनः" स्ट्रिंग को संदर्भित करता है जहां हम अपने वांछित पैटर्न के लिए खोज कर रहे हैं?
vishal

@ vishal.k यह अंतर्निहित reमॉड्यूल को संदर्भित करता है , अर्थात import re
चंद्रग्रहण

मामले में किसी और ने एक ही गलती की: आपको from datetime import datetimeइसके बजाय की जरूरत हैimport datetime
dankal444

155

अजगर-खजूर का उपयोग :

In [1]: import dateutil.parser as dparser

In [18]: dparser.parse("monkey 2010-07-10 love banana",fuzzy=True)
Out[18]: datetime.datetime(2010, 7, 10, 0, 0)

अमान्य तिथियां ValueError:

In [19]: dparser.parse("monkey 2010-07-32 love banana",fuzzy=True)
# ValueError: day is out of range for month

यह कई स्वरूपों में तिथियों को पहचान सकता है:

In [20]: dparser.parse("monkey 20/01/1980 love banana",fuzzy=True)
Out[20]: datetime.datetime(1980, 1, 20, 0, 0)

ध्यान दें कि यह अनुमान लगाता है कि क्या तारीख अस्पष्ट है:

In [23]: dparser.parse("monkey 10/01/1980 love banana",fuzzy=True)
Out[23]: datetime.datetime(1980, 10, 1, 0, 0)

लेकिन जिस तरह से यह अस्पष्ट तिथियों को पार करता है वह अनुकूलन योग्य है:

In [21]: dparser.parse("monkey 10/01/1980 love banana",fuzzy=True, dayfirst=True)
Out[21]: datetime.datetime(1980, 1, 10, 0, 0)

3
@ हमीश: अगर दो तारीखें हैं (जैसा कि इस मामले में "monkey 10/01/1980 love 7/10/2010 banana"), यह एक वैल्यूअर को बढ़ा सकता है, या (जैसा भी "monkey 10/01/1980 love 2010-07-10 banana"हो) दूसरी तारीख को घंटे, मिनट, सेकंड या टाइमज़ोन को दर्शाते हुए गलत व्याख्या कर सकता है। fuzzy=Trueयह अनुमान लगाने का लाइसेंस देता है।
unutbu

1
@unutbu str = "flufie  · द्वारा अक्टूबर 14, 2010 11:22 बजे  · 26 उत्तर" का उपयोग करके dateutil मैं हो रही है "ValueError: घंटे 0..23 में होना चाहिए"
सरवनन

पाठ में 1 से अधिक दिनांक होने पर क्या होता है?
अल्व्स

1
@alvas: parseफ़ंक्शन एक अपवाद को बढ़ा सकता है (भले ही fuzzy=True), या इसके साथ fuzzy=True, यह पहली तारीख या दोनों तिथियों के कुछ हिस्सों से बना एक मैश-मैश वापस कर सकता है। तो वास्तव में, parseकेवल एक तार युक्त होना चाहिए जिसमें एक तिथि हो।
अनुतु

1
@ कैलेघ: हाँ, फ़ज़ी_विथ_टोकेंस = ट्रू का उपयोग करके सूचकांकों को निकालना संभव होगा । यदि आप अधिक स्पष्टीकरण चाहते हैं, तो कृपया एक नया प्रश्न शुरू करें।
16

27

अजगर में एक स्ट्रिंग से तारीख निकालने के लिए; उपलब्ध सबसे अच्छा मॉड्यूल डेटफाइंडर मॉड्यूल है।

आप नीचे दिए गए आसान चरणों का पालन करके अपने पायथन प्रोजेक्ट में इसका उपयोग कर सकते हैं।

चरण 1: डेटफाइंडर पैकेज स्थापित करें

pip install datefinder

चरण 2: अपने प्रोजेक्ट में इसका उपयोग करें

import datefinder

input_string = "monkey 2010-07-10 love banana"
# a generator will be returned by the datefinder module. I'm typecasting it to a list. Please read the note of caution provided at the bottom.
matches = list(datefinder.find_dates(input_string))

if len(matches) > 0:
    # date returned will be a datetime.datetime object. here we are only using the first match.
    date = matches[0]
    print date
else:
    print 'No dates found'

नोट: यदि आप बड़ी संख्या में मैचों की उम्मीद कर रहे हैं; फिर सूची में टाइपकास्ट करना अनुशंसित तरीका नहीं होगा क्योंकि यह एक बड़ा प्रदर्शन ओवरहेड होगा।


1
मैंने पाया कि datefinderएक अस्पष्ट माध्यम से python-dateutilकेवल दो संभावित तिथियों को वापस करने से बेहतर अस्पष्ट मिलान तिथि प्रदान की गई। ब्लॉग पोस्ट पांच के विपरीत। यह निश्चित नहीं है कि यह अलग-अलग स्थानों को कैसे संभालता है ...
CpILL

यह बहुत अच्छा है, सिवाय इसके कि कोई काम नहीं करता है जब कोई कोलन होता है (:) डेट स्ट्रिंग से पहले: string = "Assessment Date: 17-May-2017 at 13:31" list(datefinder.find_dates(string.lower())) #[] string = "Assessment Date 17-May-2017 at 13:31" list(datefinder.find_dates(string.lower())) #[datetime.datetime(2017, 5, 17, 13, 31)]
नरहरि बीएम

इस बात से सहमत हैं कि अस्पष्ट पाठ के लिए डेटफाइंडर डेटरसेर से बेहतर है
जेई जंग

2

Pyrorok का उपयोग करके, आप अमूर्त एक्सटेंशन को रेगुलर एक्सप्रेशन सिंटैक्स में परिभाषित कर सकते हैं।

कस्टम पैटर्न आपके regex को प्रारूप में शामिल किया जा सकता है %{PATTERN_NAME}

आप उस पैटर्न के लिए एक लेबल भी बना सकते हैं, एक कोलन के साथ अलग करके %s{PATTERN_NAME:matched_string}:। यदि पैटर्न मेल खाता है, तो परिणामी शब्दकोश के भाग के रूप में मान लौटाया जाएगा (जैसे result.get('matched_string'))

उदाहरण के लिए:

from pygrok import Grok

input_string = 'monkey 2010-07-10 love banana'
date_pattern = '%{YEAR:year}-%{MONTHNUM:month}-%{MONTHDAY:day}'

grok = Grok(date_pattern)
print(grok.match(input_string))

परिणामी मूल्य एक शब्दकोश होगा:

{'month': '07', 'day': '10', 'year': '2010'}

यदि input_string में date_pattern मौजूद नहीं है, तो रिटर्न वैल्यू होगी None। इसके विपरीत, यदि आपके पैटर्न में कोई लेबल नहीं है, तो यह एक खाली शब्दकोश लौटाएगा{}

संदर्भ:


यह परिश्रम अर्थात बहुत अजगर 2
वाल्टर

1

आप डेटाप्रेसर मॉड्यूल को भी आज़मा सकते हैं , जो मुफ़्त टेक्स्ट पर डेटफ़ाइंडर की तुलना में धीमा हो सकता है, लेकिन जिसमें अधिक संभावित मामलों और दिनांक स्वरूपों को कवर करना चाहिए, साथ ही साथ भाषाओं की एक महत्वपूर्ण संख्या भी होनी चाहिए।


-5

यदि आप स्ट्रिंग में दिनांक ऑब्जेक्ट की स्थिति जानते हैं (उदाहरण के लिए एक लॉग फ़ाइल में), तो आप पूरी तरह से प्रारूप को जाने बिना दिनांक को निकालने के लिए .split () [सूचकांक] का उपयोग कर सकते हैं।

उदाहरण के लिए:

>>> string = 'monkey 2010-07-10 love banana'
>>> date = string.split()[1]
>>> date
'2010-07-10'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.