मैं पायथन में आंशिक तिथियां कैसे निर्धारित करूं? एक अज्ञात वर्ष की तरह, या महीने का अज्ञात दिन?


11

मैं जैसे तथ्यों पर कब्जा करने में सक्षम होना चाहते Bob was born in 2000और Bill's birthday is May 7th

दोनों उदाहरणों में हम व्यक्ति की जन्मतिथि का केवल एक हिस्सा जानते हैं। एक मामले में हम केवल वर्ष जानते हैं; दूसरे मामले में हम महीने और दिन को जानते हैं, लेकिन साल को नहीं।

मैं इस जानकारी को कैसे कैप्चर करूं?

यह कैसे काम कर सकता है इसके कुछ उदाहरण:

एक लाइब्रेरी की तरह डेटाइम की कल्पना करें जिसने अज्ञात क्षेत्रों का प्रतिनिधित्व करने की अनुमति नहीं दी। मेरे पास निम्नलिखित की तरह कोड हो सकता है:

date_a = date(2000, 5, None)
date_b = date(2000, 6, None)
difference = date_b - date_a
assert difference.min.days == 1
assert difference.max.days == 60  # Or something close to 60.
assert equal(date_a, date_b) == False

date_c = date(2000, 5, None)
assert equal(date_a, date_c) == Maybe

यह केवल एक उदाहरण है कि यह कैसे व्यवहार कर सकता है। मैं जरूरी नहीं कि यह सटीक व्यवहार चाहता हूँ।


सामान्य तौर पर, जिस तरह से आप इस तरह की चीजों से निपटते हैं, उदाहरण के लिए, वर्ष 0001 में .NET में उन तारीखों के लिए, जिनके पास एक वर्ष नहीं है, और 1 जनवरी एक महीने और दिन के बिना वर्षों के लिए है।
रॉबर्ट हार्वे

मैंने लाइब्रेरी के लिए अनुरोधों को हटाने के लिए आपके प्रश्न को संपादित किया। इस साइट पर ऐसे प्रश्न ऑफ़-टॉपिक हैं।

@RobertHarvey मैं आपके सुझाव का उपयोग नहीं कर सकता। अगर हम देखते हैं कि बॉब का जन्म 1 जनवरी 2000 को हुआ था, तो हमें नहीं पता कि इसका सही मतलब क्या है। हम यह नहीं बता सकते हैं कि क्या उनका जन्म २००० के पहले दिन हुआ था, या यदि वह २००० के किसी भी दिन पैदा हुआ था। हमें अंतर जानने की जरूरत है।
बटंस May४०

@ रोबर्टहाइवे मैं जानता हूं कि यह आम है, लेकिन मैंने ऐसे सिग्नल मूल्यों के खराब विकल्पों के कारण कई बुरी विफलताएं देखी हैं। (इसके अलावा, मैं यह सवाल का जवाब के रूप में ओ पी की जरूरत है केवल से निपटने के लिए नहीं लगता है कि कुछ तारीखों अज्ञात जा रहा है इस तरह के मामलों में 1 जनवरी को सेट करने से आपको अज्ञात से वास्तविक जनवरी 1st दिनांकों अंतर करने के लिए अनुमति नहीं
Gort रोबोट

5
@ Buttons840: फिर आपको एक वर्ग लिखना होगा जो आपके इच्छित व्यवहारों को एन्क्रिप्ट करता है। आपको मौजूदा तिथि वर्ग को लपेटना चाहिए और अपने वांछित व्यवहार को जोड़ना चाहिए।
रॉबर्ट हार्वे

जवाबों:


3

सबसे पहले, एक बार जब आप उनके घटक घटकों में तारीखों को कम करना शुरू करते हैं, तो वे अब तारीखें नहीं होती हैं।

इसी तरह से ओओपी को तोड़े बिना उपवर्गों के माध्यम से कार्यक्षमता को निकालना संभव नहीं है, भ्रमों (या बदतर) को पैदा किए बिना तारीखों और तारीखों के अंशों को मिलाना संभव नहीं है (बिना किसी और चीज को तोड़े हुए) अपने कोड उदाहरण में उन्हें अनुकूल बना सकते हैं।

यदि आप एक वर्ष पर कब्जा करना चाहते हैं, तो एक साधारण पूर्णांक वाले ऑब्जेक्ट के साथ क्या गलत है? यदि आप एक महीने और दिन पर कब्जा करना चाहते हैं, तो एक महीने की गणना और पूर्णांक दिन पर कब्जा क्यों न करें? हो सकता है कि उन्हें आंतरिक रूप से किसी दिनांक ऑब्जेक्ट में संग्रहीत करें ताकि आपको उचित सीमा की जाँच हो (उदाहरण के लिए 31 फरवरी कोई मतलब नहीं है)। हालाँकि एक अलग इंटरफ़ेस को उजागर करें।

आप एक वर्ष की तारीख की तुलना यह देखने के लिए क्यों करना चाहेंगे कि क्या वे समान, अधिक या कम हैं? इसका कोई मतलब नहीं है: तुलना करने के लिए पर्याप्त जानकारी नहीं है। हालांकि, अन्य तुलनाएं हैं जो समझ में आ सकती हैं (यह स्यूडोकोड है):

Year y = Year(2015)
Date d = Date(2015, 01, 01)
assert y.contains(d) == True

2

रॉबर्ट हार्वे की दूसरी टिप्पणी में सही उत्तर है, लेकिन मुझे इस पर थोड़ा विस्तार करने दें।

लोगों के जन्म का वर्ष और लोगों की जन्मतिथि पूरी तरह से अलग-अलग संस्थाएं हैं, इसलिए आपको दोनों के लिए एक ही तंत्र का उपयोग करने की आवश्यकता नहीं है (और वास्तव में आपको नहीं करना चाहिए)।

जन्मतिथियों के लिए, आप BirthDateडेटा प्रकार (या संभवतः YearlyRecurringDateहालांकि मैं अभी एक सभ्य नाम के साथ नहीं आ सकता है) को तैयार कर सकता हूं, जिसमें केवल dateएक निरंतर वर्ष के साथ होगा , जैसे 2000 सम्मेलन द्वारा। वर्ष 2000 एक अच्छा विकल्प है क्योंकि यह लीप था, इसलिए यह उन लोगों को विफल नहीं करेगा जिनका जन्मदिन 28 फरवरी को है।

जन्म सालों के लिए, यदि आप एक वसीयत कर सकते हैं BirthYearडेटा प्रकार (या संभवतः एक ApproximateDateडेटा प्रकार) जो एक होते हैं date, और परिशुद्धता का एक संकेतक: Year, Month, Full

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


1

मेरा मानना ​​है कि आप जो वर्णन कर रहे हैं, वह datetimeमॉड्यूल के लिए एक ड्रॉप-इन प्रतिस्थापन होगा जो datetime.datetimeविशेषताओं (वर्ष, माह, आदि) को अनिश्चितता माप के साथ मूल्यों (केवल मूल्यों के बजाय) के रूप में लागू करता है ।

पाइथन पैकेज अनिश्चित संख्या (उदाहरण के लिए: अनिश्चितता पैकेज) के साथ मदद करने के लिए मौजूद हैं , और शायद यह भी मुश्किल नहीं होगा datetimeकि प्रत्येक विशेषता पर अनिश्चितता का उपयोग करें। मैं भी एक देखना चाहूंगा और शायद इसका उपयोग भी कर सकूं। निश्चित रूप udatetimeसे पूर्वोक्त अनिश्चितताओं के पैकेज में शामिल किए जाने के लिए एक तर्क दिया जा सकता है ।

आपके उदाहरण कुछ इस तरह होंगे:

bob_bday = udatetime(2000, (6,6))  # 2000-06 +/- 6mo
>>> 2000-??-?? T??:??:??
bil_bday = udatetime((1970, 50), 3, 7)  # assume bill is ~40 +/- 40 
>>> [1970+/-40]-03-07 T??:??:??

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

# ali was born in spring
ali_bday = udatetime((), (4.5, 1.5))
>>> [1970+/-40]-[4.5+/-1.5]-?? T??:??:??

एक और विचार यह है कि यहां अनिश्चितताओं का अधिक सटीक होना वास्तव में प्रकार का होना चाहिए timedelta। पाठक इसे अनिश्चितताओं udatetimeका उपयोग करने के लिए संक्षिप्त और पूर्ण निर्माणकर्ता का पता लगाने के लिए एक अभ्यास के रूप में छोड़ timedeltaदेता है।

तो अंततः मैं कहूंगा कि आप जो वर्णन करते हैं वह अनिश्चितताओं के साथ "आसानी से" है, लेकिन एक udatetimeका कार्यान्वयन व्यावहारिक रूप से काफी कठिन है। अधिकांश "आसान" मार्ग लेगा और घटकों में डेटाइम को तोड़ देगा और स्वतंत्र रूप से उन पर अनिश्चितता को ट्रैक कर सकता है, लेकिन अगर आप महत्वाकांक्षी महसूस कर रहे हैं uncertaintiesपैकेज (या किसी अन्य) के लिए एक पुल अनुरोध में रुचि हो सकती है udatetime


0

एक "अवधि" वर्ग क्यों नहीं बनाया गया है जो संरचना से ए तक लागू होता है।

"बॉब का जन्म 2000 में हुआ था" ->

period {
   from  {
      yy = 2000;
      mm = 01;
      dd = 01; 
   }
   to {
     yy = 2000;
     mm = 12;
     dd = 31;
   }
   fuzz = 365;
}

फिर आप विभिन्न खोज विधियों को क्रियान्वित कर सकते हैं जैसे कि तारीखों से। फ़ज़ विशेषता इस बात का एक उपयोगी संकेत देती है कि तारीख कितनी सही है इसलिए आप सटीक मिलान के लिए फ़ज़ == 1 निर्दिष्ट कर सकते हैं, या फ़ेज़ == 31 एक महीने के भीतर या उसके लिए।

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