NumPy 1.14 - Datetimes and Timedeltas

डेटाइम और टेमेडेल्टास




numpy

डेटाइम और टेमेडेल्टास

संस्करण 1.7.0 में नया।

NumPy 1.7 में शुरू, कोर सरणी डेटा प्रकार हैं जो मूल रूप से डेटाइम कार्यक्षमता का समर्थन करते हैं। डेटा प्रकार को "डेटाटाइम 64" कहा जाता है, इसलिए इसका नाम "डेटाइम" पहले से ही पायथन में शामिल डेटाइम लाइब्रेरी द्वारा लिया गया है।

ध्यान दें

डेटाटाइम API 1.7.0 में प्रायोगिक है, और भविष्य के संस्करणों में बदलावों से गुजर सकता है।

बेसिक डेटाटम्स

डेटासेटाइम बनाने का सबसे मूल तरीका आईएसओ 8601 तारीख या डेटाइम प्रारूप में तार से है। आंतरिक भंडारण के लिए इकाई स्वचालित रूप से स्ट्रिंग के रूप से चुनी जाती है, और यह एक तारीख इकाई या एक समय इकाई हो सकती है । दिनांक इकाइयाँ वर्ष ('Y'), महीने ('M'), सप्ताह ('W') और दिन ('D') हैं, जबकि समय इकाइयाँ घंटे ('h'), मिनट ('m') हैं। ), सेकंड ('एस'), मिलीसेकंड ('एमएस'), और कुछ अतिरिक्त एसआई-उपसर्ग सेकंड-आधारित इकाइयाँ।

उदाहरण

एक साधारण आईएसओ तिथि:

>>> np.datetime64('2005-02-25')
numpy.datetime64('2005-02-25')

यूनिट के लिए महीनों का उपयोग करना:

>>> np.datetime64('2005-02')
numpy.datetime64('2005-02')

केवल महीना निर्दिष्ट करना, लेकिन 'दिन' इकाई के लिए मजबूर करना:

>>> np.datetime64('2005-02', 'D')
numpy.datetime64('2005-02-01')

दिनांक और समय से:

>>> np.datetime64('2005-02-25T03:30')
numpy.datetime64('2005-02-25T03:30')

किसी स्ट्रिंग से डेटाटाइम्स की एक सरणी बनाते समय, जेनेरिक इकाइयों के साथ डेटाइम प्रकार का उपयोग करके, इनपुट से इकाई को स्वचालित रूप से चुनना अभी भी संभव है।

उदाहरण

>>> np.array(['2007-07-13', '2006-01-13', '2010-08-13'], dtype='datetime64')
array(['2007-07-13', '2006-01-13', '2010-08-13'], dtype='datetime64[D]')
>>> np.array(['2001-01-01T12:00', '2002-02-03T13:56:03.172'], dtype='datetime64')
array(['2001-01-01T12:00:00.000-0600', '2002-02-03T13:56:03.172-0600'], dtype='datetime64[ms]')

डेटाटाइम प्रकार कई सामान्य NumPy फ़ंक्शंस के साथ काम करता है, उदाहरण के लिए तारीखों की श्रेणी उत्पन्न करने के लिए arange का उपयोग किया जा सकता है।

उदाहरण

एक महीने के लिए सभी तिथियां:

>>> np.arange('2005-02', '2005-03', dtype='datetime64[D]')
array(['2005-02-01', '2005-02-02', '2005-02-03', '2005-02-04',
       '2005-02-05', '2005-02-06', '2005-02-07', '2005-02-08',
       '2005-02-09', '2005-02-10', '2005-02-11', '2005-02-12',
       '2005-02-13', '2005-02-14', '2005-02-15', '2005-02-16',
       '2005-02-17', '2005-02-18', '2005-02-19', '2005-02-20',
       '2005-02-21', '2005-02-22', '2005-02-23', '2005-02-24',
       '2005-02-25', '2005-02-26', '2005-02-27', '2005-02-28'],
       dtype='datetime64[D]')

डेटाइम ऑब्जेक्ट समय में एक ही क्षण का प्रतिनिधित्व करता है। यदि दो डेटाटाइम्स की अलग-अलग इकाइयाँ हैं, तो वे समय के एक ही क्षण का प्रतिनिधित्व कर सकते हैं, और महीनों जैसी बड़ी इकाई से दिन की तरह छोटी इकाई में परिवर्तित करना एक 'सुरक्षित' कास्ट माना जाता है क्योंकि समय के क्षण का प्रतिनिधित्व अभी भी किया जा रहा है।

उदाहरण

>>> np.datetime64('2005') == np.datetime64('2005-01-01')
True
>>> np.datetime64('2010-03-14T15Z') == np.datetime64('2010-03-14T15:00:00.00Z')
True

डेटाइम और टेमेडेल्टा अंकगणित

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

डेटाटाइम और टेमीडेल्टस सरल डेटाटाइम गणना के लिए तरीके प्रदान करने के लिए एक साथ काम करते हैं।

उदाहरण

>>> np.datetime64('2009-01-01') - np.datetime64('2008-01-01')
numpy.timedelta64(366,'D')
>>> np.datetime64('2009') + np.timedelta64(20, 'D')
numpy.datetime64('2009-01-21')
>>> np.datetime64('2011-06-15T00:00') + np.timedelta64(12, 'h')
numpy.datetime64('2011-06-15T12:00-0500')
>>> np.timedelta64(1,'W') / np.timedelta64(1,'D')
7.0

दो Timedelta इकाइयाँ ('Y', वर्ष और 'M', महीने) हैं जिन्हें विशेष रूप से व्यवहार किया जाता है, क्योंकि वे कितने समय का उपयोग करने के आधार पर परिवर्तनों का प्रतिनिधित्व करती हैं। जबकि एक समयसीमा दिन इकाई 24 घंटों के बराबर होती है, एक महीने की इकाई को दिनों में बदलने का कोई तरीका नहीं है, क्योंकि अलग-अलग महीनों में अलग-अलग दिनों की संख्या होती है।

उदाहरण

>>> a = np.timedelta64(1, 'Y')
>>> np.timedelta64(a, 'M')
numpy.timedelta64(12,'M')
>>> np.timedelta64(a, 'D')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Cannot cast NumPy timedelta64 scalar from metadata [Y] to [D] according to the rule 'same_kind'

डाइमटाइम इकाइयाँ

डेटाटाइम और टेमेडेल्टा डेटा प्रकार बड़ी संख्या में समय इकाइयों का समर्थन करते हैं, साथ ही जेनेरिक इकाइयां जो इनपुट डेटा के आधार पर किसी भी अन्य इकाइयों में शामिल हो सकती हैं।

डेटासाइम हमेशा POSIX समय के आधार पर संग्रहीत किए जाते हैं (हालांकि एक TAI मोड होने से जो लीप-सेकंड के लेखांकन के लिए प्रस्तावित है), 1970-01-01T00: 00Z की अवधि के साथ। इसका मतलब है कि समर्थित तिथियां हमेशा युगांतर के चारों ओर एक सममित अंतराल होती हैं, जिन्हें नीचे दी गई तालिका में "टाइम स्पैन" कहा जाता है।

स्पैन की लंबाई दिनांक या इकाई की लंबाई से 64-बिट पूर्णांक की सीमा है। उदाहरण के लिए, 'W' (सप्ताह) के लिए समय अवधि 'D' (दिन) के लिए समय अवधि की तुलना में 7 गुना अधिक है, और 'D' (दिन) के लिए समय अवधि, समय अवधि की तुलना में ठीक 24 गुना अधिक है 'h' (घंटा) के लिए।

यहाँ दिनांक इकाइयाँ हैं:

कोड अर्थ समय अवधि (सापेक्ष) समय अवधि (निरपेक्ष)
Y साल +/- 9.2e18 वर्ष [9.2e18 ई.पू., 9.2e18 ईस्वी]
एम महीना +/- 7.6e17 वर्ष [7.6e17 ई.पू., 7.6e17 ईस्वी]
डब्ल्यू सप्ताह +/- 1.7e17 वर्ष [1.7e17 ईसा पूर्व, 1.7e17 ईस्वी]
डी दिन +/- 2.5e16 वर्ष [2.5e16 ई.पू., 2.5e16 ईस्वी]

और यहाँ समय इकाइयाँ हैं:

कोड अर्थ समय अवधि (सापेक्ष) समय अवधि (निरपेक्ष)
घंटा +/- 1.0e15 वर्ष [1.0e15 ई.पू., 1.0e15 ई.पू.]
मीटर मिनट +/- 1.7e13 साल [1.7e13 ई.पू., 1.7e13 ई.पू.]
रों दूसरा +/- 2.9e11 साल [2.9e11 ईसा पूर्व, 2.9e11 ईस्वी]
सुश्री मिलीसेकंड +/- 2.9e8 साल [2.9e8 ईसा पूर्व, 2.9e8 ईस्वी]
हमें माइक्रोसेकंड +/- 2.9e5 साल [290301 ईसा पूर्व, 294241 ईस्वी]
एनएस nanosecond +/- 292 वर्ष [१६ [ई।, २२६२ ई।]
ps पीकोसैकन्ड +/- १०६ दिन [1969 ई।, 1970 ई।]
FS femtosecond +/- 2.6 घंटे [1969 ई।, 1970 ई।]
जैसा attosecond +/- 9.2 सेकंड [1969 ई।, 1970 ई।]

व्यवसाय दिवस की कार्यक्षमता

डेटाटाइम को उन संदर्भों में उपयोग करने की अनुमति देने के लिए जहां सप्ताह के केवल कुछ दिन मान्य हैं, NumPy में "बसडे" (व्यावसायिक दिन) फ़ंक्शन का एक सेट शामिल है।

बस दिन के कार्यों के लिए डिफ़ॉल्ट यह है कि केवल वैध दिन शुक्रवार (सामान्य व्यावसायिक दिनों) के माध्यम से सोमवार होते हैं। कार्यान्वयन "वीकमस्क" पर आधारित है जिसमें वैध दिनों को इंगित करने के लिए 7 बूलियन झंडे होते हैं; कस्टम सप्ताहमासिक संभव हैं जो मान्य दिनों के अन्य सेटों को निर्दिष्ट करते हैं।

"बसडे" फ़ंक्शन अतिरिक्त रूप से "छुट्टी" तिथियों की एक सूची की जांच कर सकते हैं, विशिष्ट तिथियां जो वैध दिन नहीं हैं।

फ़ंक्शन busday_offset आपको व्यावसायिक दिनों में निर्दिष्ट ऑफ़सेट को 'D' (दिन) की इकाई के साथ busday_offset पर लागू करने की अनुमति देता है।

उदाहरण

>>> np.busday_offset('2011-06-23', 1)
numpy.datetime64('2011-06-24')
>>> np.busday_offset('2011-06-23', 2)
numpy.datetime64('2011-06-27')

जब एक इनपुट तारीख सप्ताहांत या छुट्टी पर आती है, तो busday_offset पहले किसी मान्य व्यावसायिक दिन के लिए तारीख को रोल करने के लिए एक नियम लागू करता है, फिर ऑफसेट लागू करता है। डिफ़ॉल्ट नियम 'बढ़ा' है, जो केवल एक अपवाद को जन्म देता है। आमतौर पर उपयोग किए जाने वाले नियम 'आगे' और 'पिछड़े' हैं।

उदाहरण

>>> np.busday_offset('2011-06-25', 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Non-business day date in busday_offset
>>> np.busday_offset('2011-06-25', 0, roll='forward')
numpy.datetime64('2011-06-27')
>>> np.busday_offset('2011-06-25', 2, roll='forward')
numpy.datetime64('2011-06-29')
>>> np.busday_offset('2011-06-25', 0, roll='backward')
numpy.datetime64('2011-06-24')
>>> np.busday_offset('2011-06-25', 2, roll='backward')
numpy.datetime64('2011-06-28')

कुछ मामलों में, वांछित उत्तर प्राप्त करने के लिए रोल और ऑफ़सेट का उपयुक्त उपयोग आवश्यक है।

उदाहरण

एक तारीख को या उसके बाद पहला कारोबारी दिन:

>>> np.busday_offset('2011-03-20', 0, roll='forward')
numpy.datetime64('2011-03-21','D')
>>> np.busday_offset('2011-03-22', 0, roll='forward')
numpy.datetime64('2011-03-22','D')

पहला व्यावसायिक दिन एक तारीख के बाद सख्ती से:

>>> np.busday_offset('2011-03-20', 1, roll='backward')
numpy.datetime64('2011-03-21','D')
>>> np.busday_offset('2011-03-22', 1, roll='backward')
numpy.datetime64('2011-03-23','D')

यह फ़ंक्शन छुट्टियों जैसे कुछ प्रकार के दिनों की गणना करने के लिए भी उपयोगी है। कनाडा और अमेरिका में, मदर्स डे मई में दूसरे रविवार को होता है, जिसकी गणना एक कस्टम वीकमास्क के साथ की जा सकती है।

उदाहरण

>>> np.busday_offset('2012-05', 1, roll='forward', weekmask='Sun')
numpy.datetime64('2012-05-13','D')

जब सप्ताहांत और छुट्टियों की एक विशेष पसंद के साथ कई व्यावसायिक तिथियों में हेरफेर करने के लिए प्रदर्शन महत्वपूर्ण है, तो एक ऑब्जेक्ट busdaycalendar जो डेटा को एक अनुकूलित रूप में संग्रहीत करता है।

np.is_busday ():

is_busday मान का परीक्षण करने के लिए यह देखने के लिए कि क्या यह वैध दिन है, is_busday उपयोग is_busday

उदाहरण

>>> np.is_busday(np.datetime64('2011-07-15'))  # a Friday
True
>>> np.is_busday(np.datetime64('2011-07-16')) # a Saturday
False
>>> np.is_busday(np.datetime64('2011-07-16'), weekmask="Sat Sun")
True
>>> a = np.arange(np.datetime64('2011-07-11'), np.datetime64('2011-07-18'))
>>> np.is_busday(a)
array([ True,  True,  True,  True,  True, False, False], dtype='bool')

np.busday_count ():

यह जानने के लिए कि कितने मान्य दिन busday_count तिथियों की एक निर्दिष्ट श्रेणी में हैं, busday_count उपयोग busday_count :

उदाहरण

>>> np.busday_count(np.datetime64('2011-07-11'), np.datetime64('2011-07-18'))
5
>>> np.busday_count(np.datetime64('2011-07-18'), np.datetime64('2011-07-11'))
-5

यदि आपके पास डेटाइम64 दिन के मानों की एक सरणी है, और आप चाहते हैं कि उनमें से कितने मान्य तिथियों की गणना है, तो आप यह कर सकते हैं:

उदाहरण

>>> a = np.arange(np.datetime64('2011-07-11'), np.datetime64('2011-07-18'))
>>> np.count_nonzero(np.is_busday(a))
5

कस्टम सप्ताहांत

यहाँ कस्टम वीकमास्क मानों के कई उदाहरण दिए गए हैं। इन उदाहरणों में शुक्रवार के वैध दिन होने वाले सोमवार के "बसडे" डिफ़ॉल्ट को निर्दिष्ट किया गया है।

कुछ उदाहरण:

# Positional sequences; positions are Monday through Sunday.
# Length of the sequence must be exactly 7.
weekmask = [1, 1, 1, 1, 1, 0, 0]
# list or other sequence; 0 == invalid day, 1 == valid day
weekmask = "1111100"
# string '0' == invalid day, '1' == valid day

# string abbreviations from this list: Mon Tue Wed Thu Fri Sat Sun
weekmask = "Mon Tue Wed Thu Fri"
# any amount of whitespace is allowed; abbreviations are case-sensitive.
weekmask = "MonTue Wed  Thu\tFri"

NumPy 1.11 के साथ परिवर्तन

NumPy के पूर्व संस्करणों में, डेटाटाइम प्रकार हमेशा UTC में संग्रहीत होता है। डिफ़ॉल्ट रूप से, एक स्ट्रिंग से एक datetime64 ऑब्जेक्ट बनाना या इसे स्थानीय समय से परिवर्तित करना या प्रिंट करना होगा:

# old behavior
>>>> np.datetime64('2000-01-01T00:00:00')
numpy.datetime64('2000-01-01T00:00:00-0800')  # note the timezone offset -08:00

डेटाटाइम 64 उपयोगकर्ताओं की आम सहमति इस बात से सहमत है कि यह व्यवहार अवांछनीय है और कैसे डेटाटाइम 64 का उपयोग किया जाता है (जैसे, पांडा द्वारा)। अधिकांश उपयोग के मामलों के लिए, एक टाइमज़ोन भोले डेटाइम प्रकार को प्राथमिकता दी जाती है, जो पायथन मानक पुस्तकालय में datetime.datetime प्रकार के समान है। तदनुसार, डेटाटाइम64 अब मानता है कि इनपुट स्थानीय समय में है, और न ही यह स्थानीय समय प्रिंट करता है:

>>>> np.datetime64('2000-01-01T00:00:00')
numpy.datetime64('2000-01-01T00:00:00')

पश्चगामी अनुकूलता के लिए, डेटटाइम 64 अभी भी टाइमज़ोन ऑफ़सेट को पार्स करता है, जिसे वह यूटीसी में परिवर्तित करके संभालता है। हालांकि, परिणामी डेटाइम टाइमज़ोन भोली है:

>>> np.datetime64('2000-01-01T00:00:00-08')
DeprecationWarning: parsing timezone aware datetimes is deprecated; this will raise an error in the future
numpy.datetime64('2000-01-01T08:00:00')

इस परिवर्तन के लिए एक कोरोलरी के रूप में, अब हम डेट यूनिटों के साथ कास्टिंग और समय-समय पर डेटाेटाइम के बीच कास्टिंग पर प्रतिबंध नहीं लगाते हैं। समय-समय पर भोली-भाली डेटाइम के साथ, तारीख से समय तक कास्टिंग के लिए नियम अब अस्पष्ट नहीं है।

1.6 और 1.7 डेटासेट के बीच अंतर

NumPy 1.6 रिलीज़ में 1.7 से अधिक आदिम डेटाटाइम डेटा प्रकार शामिल हैं। यह खंड उन कई परिवर्तनों का दस्तावेजीकरण करता है जो हुए हैं।

स्ट्रिंग पार्सिंग

NumPy 1.6 में डेटाटाइम स्ट्रिंग पार्सर बहुत ही उदार है जो इसे स्वीकार करता है, और चुपचाप त्रुटियों के बिना अमान्य इनपुट की अनुमति देता है। NumPy 1.7 में पार्सर कुछ सुविधा एक्सटेंशन के साथ केवल आईएसओ 8601 तारीखों को स्वीकार करने के बारे में काफी सख्त है। 1.6 हमेशा डिफ़ॉल्ट रूप से माइक्रोसेकंड (यूएस) इकाइयों का निर्माण करता है, जबकि 1.7 स्ट्रिंग के प्रारूप के आधार पर एक इकाई का पता लगाता है। यहाँ एक तुलना है:

# NumPy 1.6.1
>>> np.datetime64('1979-03-22')
1979-03-22 00:00:00
# NumPy 1.7.0
>>> np.datetime64('1979-03-22')
numpy.datetime64('1979-03-22')

# NumPy 1.6.1, unit default microseconds
>>> np.datetime64('1979-03-22').dtype
dtype('datetime64[us]')
# NumPy 1.7.0, unit of days detected from string
>>> np.datetime64('1979-03-22').dtype
dtype('<M8[D]')

# NumPy 1.6.1, ignores invalid part of string
>>> np.datetime64('1979-03-2corruptedstring')
1979-03-02 00:00:00
# NumPy 1.7.0, raises error for invalid input
>>> np.datetime64('1979-03-2corruptedstring')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Error parsing datetime string "1979-03-2corruptedstring" at position 8

# NumPy 1.6.1, 'nat' produces today's date
>>> np.datetime64('nat')
2012-04-30 00:00:00
# NumPy 1.7.0, 'nat' produces not-a-time
>>> np.datetime64('nat')
numpy.datetime64('NaT')

# NumPy 1.6.1, 'garbage' produces today's date
>>> np.datetime64('garbage')
2012-04-30 00:00:00
# NumPy 1.7.0, 'garbage' raises an exception
>>> np.datetime64('garbage')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: Error parsing datetime string "garbage" at position 0

# NumPy 1.6.1, can't specify unit in scalar constructor
>>> np.datetime64('1979-03-22T19:00', 'h')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: function takes at most 1 argument (2 given)
# NumPy 1.7.0, unit in scalar constructor
>>> np.datetime64('1979-03-22T19:00', 'h')
numpy.datetime64('1979-03-22T19:00-0500','h')

# NumPy 1.6.1, reads ISO 8601 strings w/o TZ as UTC
>>> np.array(['1979-03-22T19:00'], dtype='M8[h]')
array([1979-03-22 19:00:00], dtype=datetime64[h])
# NumPy 1.7.0, reads ISO 8601 strings w/o TZ as local (ISO specifies this)
>>> np.array(['1979-03-22T19:00'], dtype='M8[h]')
array(['1979-03-22T19-0500'], dtype='datetime64[h]')

# NumPy 1.6.1, doesn't parse all ISO 8601 strings correctly
>>> np.array(['1979-03-22T12'], dtype='M8[h]')
array([1979-03-22 00:00:00], dtype=datetime64[h])
>>> np.array(['1979-03-22T12:00'], dtype='M8[h]')
array([1979-03-22 12:00:00], dtype=datetime64[h])
# NumPy 1.7.0, handles this case correctly
>>> np.array(['1979-03-22T12'], dtype='M8[h]')
array(['1979-03-22T12-0500'], dtype='datetime64[h]')
>>> np.array(['1979-03-22T12:00'], dtype='M8[h]')
array(['1979-03-22T12-0500'], dtype='datetime64[h]')

इकाई रूपांतरण

डेटाइम का 1.6 कार्यान्वयन इकाइयों के बीच सही रूप से परिवर्तित नहीं होता है।:

# NumPy 1.6.1, the representation value is untouched
>>> np.array(['1979-03-22'], dtype='M8[D]')
array([1979-03-22 00:00:00], dtype=datetime64[D])
>>> np.array(['1979-03-22'], dtype='M8[D]').astype('M8[M]')
array([2250-08-01 00:00:00], dtype=datetime64[M])
# NumPy 1.7.0, the representation is scaled accordingly
>>> np.array(['1979-03-22'], dtype='M8[D]')
array(['1979-03-22'], dtype='datetime64[D]')
>>> np.array(['1979-03-22'], dtype='M8[D]').astype('M8[M]')
array(['1979-03'], dtype='datetime64[M]')

डाटटाइम अरिथमेटिक

डेटाइम का 1.6 कार्यान्वयन केवल अंकगणित संचालन के एक छोटे उपसमूह के लिए सही ढंग से काम करता है। यहाँ हम कुछ सरल मामलों को दिखाते हैं:

# NumPy 1.6.1, produces invalid results if units are incompatible
>>> a = np.array(['1979-03-22T12'], dtype='M8[h]')
>>> b = np.array([3*60], dtype='m8[m]')
>>> a + b
array([1970-01-01 00:00:00.080988], dtype=datetime64[us])
# NumPy 1.7.0, promotes to higher-resolution unit
>>> a = np.array(['1979-03-22T12'], dtype='M8[h]')
>>> b = np.array([3*60], dtype='m8[m]')
>>> a + b
array(['1979-03-22T15:00-0500'], dtype='datetime64[m]')

# NumPy 1.6.1, arithmetic works if everything is microseconds
>>> a = np.array(['1979-03-22T12:00'], dtype='M8[us]')
>>> b = np.array([3*60*60*1000000], dtype='m8[us]')
>>> a + b
array([1979-03-22 15:00:00], dtype=datetime64[us])
# NumPy 1.7.0
>>> a = np.array(['1979-03-22T12:00'], dtype='M8[us]')
>>> b = np.array([3*60*60*1000000], dtype='m8[us]')
>>> a + b
array(['1979-03-22T15:00:00.000000-0500'], dtype='datetime64[us]')