डेटाइम, टाइमस्टैम्प और डेटाटाइम 64 के बीच रूपांतरण


291

मैं किसी numpy.datetime64वस्तु को datetime.datetime(या Timestamp) में कैसे परिवर्तित करूं ?

निम्नलिखित कोड में, मैं एक डेटाइम, टाइमस्टैम्प और डेटाटाइम 64 ऑब्जेक्ट बनाता हूं।

import datetime
import numpy as np
import pandas as pd
dt = datetime.datetime(2012, 5, 1)
# A strange way to extract a Timestamp object, there's surely a better way?
ts = pd.DatetimeIndex([dt])[0]
dt64 = np.datetime64(dt)

In [7]: dt
Out[7]: datetime.datetime(2012, 5, 1, 0, 0)

In [8]: ts
Out[8]: <Timestamp: 2012-05-01 00:00:00>

In [9]: dt64
Out[9]: numpy.datetime64('2012-05-01T01:00:00.000000+0100')

नोट: टाइमस्टैम्प से डेटाइम प्राप्त करना आसान है:

In [10]: ts.to_datetime()
Out[10]: datetime.datetime(2012, 5, 1, 0, 0)

लेकिन हम ( a ) से datetimeया कैसे निकालते हैं ?Timestampnumpy.datetime64dt64

अपडेट: मेरे डेटासेट में शायद ही कुछ उदाहरण है (शायद प्रेरक उदाहरण):

dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')

जो होना चाहिए datetime.datetime(2002, 6, 28, 1, 0), और एक लंबा नहीं (!) ( 1025222400000000000L...


2
आपको संभवतः Mcesinney के जवाब को स्वीकार करना चाहिए जो बहुत छोटा है और हाल numpyके pandasसंस्करणों पर काम करना चाहिए ।
jfs

@JFSebastian हम्म, इसका मतलब यह है कि उत्तर "np.datetime से डेटाइमटाइम में स्थानांतरित न करें" ... बस pd.Timestamp का उपयोग करें (क्योंकि यह वैसे भी डेटाइम का उपवर्ग है), या यदि आपको वास्तव में उपयोग करना चाहिए pd.Timestamp(dt64).to_datetime()। मैं अभी भी इस बारे में थोड़ा असंतुष्ट हूं, लेकिन निश्चित रूप से वेस 'मेरी पुरानी समस्या के लिए कम विशिष्ट है (और दुनिया के लिए इतना बेहतर है)! फिर से जवाब देने के लिए समय निकालने के लिए धन्यवाद। :)
एंडी हेडन

आपका प्रश्न "या Timestamp" कहता है और Timestampएक datetime(एक उपवर्ग) है वैसे भी :)
jfs

3
2017+ में इस सवाल पर आने वालों के लिए, डेटाइम, डेटाटाइम 64 और टाइमस्टैम्प के एक विस्तृत ट्यूटोरियल के लिए नीचे दिए गए मेरे जवाब को देखें: stackoverflow.com/a/46921593/3707607
टेड पेट्रोउ

जवाबों:


133

numpy.datetime64UTC में समय का प्रतिनिधित्व करने वाली डेटाटाइम ऑब्जेक्ट में कनवर्ट करने के लिए numpy-1.8:

>>> from datetime import datetime
>>> import numpy as np
>>> dt = datetime.utcnow()
>>> dt
datetime.datetime(2012, 12, 4, 19, 51, 25, 362455)
>>> dt64 = np.datetime64(dt)
>>> ts = (dt64 - np.datetime64('1970-01-01T00:00:00Z')) / np.timedelta64(1, 's')
>>> ts
1354650685.3624549
>>> datetime.utcfromtimestamp(ts)
datetime.datetime(2012, 12, 4, 19, 51, 25, 362455)
>>> np.__version__
'1.8.0.dev-7b75899'

उपरोक्त उदाहरण मानता है कि np.datetime64UTC में समय के अनुसार एक भोली-भाली वस्तु की व्याख्या की जाती है ।


डेटटाइम को np.datetime64 और बैक में परिवर्तित करने के लिए ( numpy-1.6):

>>> np.datetime64(datetime.utcnow()).astype(datetime)
datetime.datetime(2012, 12, 4, 13, 34, 52, 827542)

यह एक एकल np.datetime64 ऑब्जेक्ट और np.datetime64 के एक संख्यात्मक सरणी दोनों पर काम करता है।

Np.datetime64 के बारे में उसी तरह से सोचें जैसे आप np.int8, np.int16 इत्यादि के बारे में कहेंगे और बीट्विन पायथन ऑब्जेक्ट्स जैसे इंट, डेटाइम और संबंधित सुन्न वस्तुओं को बदलने के लिए एक ही तरीके को लागू करें।

आपका "गंदा उदाहरण" सही ढंग से काम करता है:

>>> from datetime import datetime
>>> import numpy 
>>> numpy.datetime64('2002-06-28T01:00:00.000000000+0100').astype(datetime)
datetime.datetime(2002, 6, 28, 0, 0)
>>> numpy.__version__
'1.6.2' # current version available via pip install numpy

मैं निम्न longपर मान पुन: उत्पन्न कर सकता हूं numpy-1.8.0:

pip install git+https://github.com/numpy/numpy.git#egg=numpy-dev

एक ही उदाहरण:

>>> from datetime import datetime
>>> import numpy
>>> numpy.datetime64('2002-06-28T01:00:00.000000000+0100').astype(datetime)
1025222400000000000L
>>> numpy.__version__
'1.8.0.dev-7b75899'

यह longइसलिए लौटाता है क्योंकि numpy.datetime64टाइप के .astype(datetime)लिए .astype(object)उस रिटर्न के बराबर है जो पायथन पूर्णांक ( long) पर है numpy-1.8

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

>>> dt64.dtype
dtype('<M8[ns]')
>>> ns = 1e-9 # number of seconds in a nanosecond
>>> datetime.utcfromtimestamp(dt64.astype(int) * ns)
datetime.datetime(2002, 6, 28, 0, 0)

डेटाटाइम 64 प्राप्त करने के लिए जो सीधे सेकंड का उपयोग करता है:

>>> dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100', 's')
>>> dt64.dtype
dtype('<M8[s]')
>>> datetime.utcfromtimestamp(dt64.astype(int))
datetime.datetime(2002, 6, 28, 0, 0)

Numpy डॉक्स का कहना है कि दिनांक API प्रयोगात्मक है और भविष्य numpy संस्करणों में बदल सकते हैं।


1
मुझे डर है कि यह हमेशा काम नहीं करता है: उदाहरण के लिए dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100'), जो एक लंबा ( 1025222400000000000L) देता है (!)
एंडी हेडन

@ भयेन: कोशिश करो type(dt64)dt64.astype(datetime) == datetime.utcfromtimestamp(dt64.astype(int)*1e-6)
jfs 17

@JFSebastian type(dt64)है numpy.datetime64और dt64.astype(datetime)एक ही लंबा int है ...: s
एंडी हेडन

@hayden: आपका सुन्न संस्करण क्या है? मेरा: numpy.__version__->'1.6.1'
jfs

संस्करण 1.8.0 (अजगर 2.7.3 में), अगर यह आपके लिए काम करता है तो यह सुझाव देता है कि यह मेरे सिस्टम पर एक बग है!
एंडी हेडन

212

आप बस pd.Timestamp कंस्ट्रक्टर का उपयोग कर सकते हैं। निम्नलिखित आरेख इस और संबंधित प्रश्नों के लिए उपयोगी हो सकता है।

समय अभ्यावेदन के बीच बातचीत


2
नाइस !!! (इस प्रश्न का उल्लेख करते हुए कि स्थिति में सुधार हुआ है, मैंने इस सवाल पर बहुत काम किया है :))
एंडी हेडन

107
बस इस आरेख को देखकर मुझे बताता है कि इस समय के सामान के साथ मौलिक रूप से कुछ गलत है।
हेजहोग

4
यह बहुत भ्रामक है कि pd.to_datetime यदि ms या ns की संख्या को देखते हुए एक टाइमस्टैम्प का उत्पादन करेगा, लेकिन अगर एक np.datetime64 दिया जाता है, तो एक datetime.datetime या np.datetime64 दिए जाने पर ... क्यों होगा यह उचित है?
श्रीमती। पूजा

7
@ Mr.WorshipMe इस आरेख को अद्यतन करने की आवश्यकता है। pd.to_datetimeकरने के लिए सब कुछ धर्मान्तरित pd.Timestamp। एक pd.Timestampवस्तु विधि है to_pydatetimeएक के लिए वापस लौटने के लिए datetime.datetimeवस्तु और एक to_datetime64में बदलने के लिए विधि np.datetime64
टेड पेट्रोउल

2
मैं इस तस्वीर का उच्च रिज़ॉल्यूशन कैसे प्राप्त कर सकता हूं?
user3226167

137

नरक में आपका स्वागत है।

आप बस एक datetime64 ऑब्जेक्ट को पास कर सकते हैं pandas.Timestamp:

In [16]: Timestamp(numpy.datetime64('2012-05-01T01:00:00.000000'))
Out[16]: <Timestamp: 2012-05-01 01:00:00>

मैंने देखा कि यह सही नहीं है, हालांकि NumPy 1.6.1 में:

numpy.datetime64('2012-05-01T01:00:00.000000+0100')

इसके अलावा, pandas.to_datetimeइसका इस्तेमाल किया जा सकता है (यह देव संस्करण से दूर है, v0.9.1 की जाँच नहीं की गई है):

In [24]: pandas.to_datetime('2012-05-01T01:00:00.000000+0100')
Out[24]: datetime.datetime(2012, 5, 1, 1, 0, tzinfo=tzoffset(None, 3600))

5
आप का उल्लेख करना चाहिए कि issubclass(pd.Timestamp, datetime)है True। और Timestampकक्षा में ही to_datetime()विधि है।
jfs

7
pd.to_datetime('2012-05-01T01:00:00.000000+0100')Timestamp('2012-05-01 00:00:00')पंडों में कम से कम लौटता है 0.17.1
एंटोन प्रोतोपोपोव

97

मुझे लगता है कि पायथन के डेटाटाइम मॉड्यूल, सुपी के डेटाटाइम 64 / टाइमडेल्टा64 और पांडा के टाइमस्टैम्प / टेमीडेल्टा ऑब्जेक्ट्स के बीच संबंधों को बेहतर ढंग से समझाने के लिए एक उत्तर में अधिक समेकित प्रयास हो सकता है।

पाइथन की डेटाइम स्टैंडर्ड लाइब्रेरी

डेटाटाइम मानक लाइब्रेरी में चार मुख्य ऑब्जेक्ट हैं

  • समय - केवल समय, घंटे, मिनट, सेकंड और माइक्रोसेकंड में मापा जाता है
  • तारीख - केवल वर्ष, महीना और दिन
  • डेटाइम - समय और तारीख के सभी घटक
  • टाइमडेल्टा - दिनों की अधिकतम इकाई के साथ समय की मात्रा

ये चार वस्तुएं बनाएं

>>> import datetime
>>> datetime.time(hour=4, minute=3, second=10, microsecond=7199)
datetime.time(4, 3, 10, 7199)

>>> datetime.date(year=2017, month=10, day=24)
datetime.date(2017, 10, 24)

>>> datetime.datetime(year=2017, month=10, day=24, hour=4, minute=3, second=10, microsecond=7199)
datetime.datetime(2017, 10, 24, 4, 3, 10, 7199)

>>> datetime.timedelta(days=3, minutes = 55)
datetime.timedelta(3, 3300)

>>> # add timedelta to datetime
>>> datetime.timedelta(days=3, minutes = 55) + \
    datetime.datetime(year=2017, month=10, day=24, hour=4, minute=3, second=10, microsecond=7199)
datetime.datetime(2017, 10, 27, 4, 58, 10, 7199)

NumPy की datetime64 और timedelta64 ऑब्जेक्ट्स

NumPy की कोई अलग तिथि और समय ऑब्जेक्ट नहीं है, समय में एक क्षण का प्रतिनिधित्व करने के लिए सिर्फ एक डेटाटाइम 64 ऑब्जेक्ट है। डेटाटाइम मॉड्यूल के डेटाटाइम ऑब्जेक्ट में माइक्रोसेकंड सटीक (एक सेकंड का एक मिलियन) है। NumPy का datetime64 ऑब्जेक्ट आपको घंटे से लेकर एटोसोसेकंड (10 ^ -18) तक इसकी शुद्धता निर्धारित करने की अनुमति देता है। यह कंस्ट्रक्टर अधिक लचीला है और कई तरह के इनपुट ले सकता है।

NumPy के datetime64 और timedelta64 ऑब्जेक्ट का निर्माण करें

इकाइयों के लिए एक स्ट्रिंग के साथ एक पूर्णांक पास करें। सभी इकाइयाँ यहाँ देखें । यह UNIX युग के बाद कई इकाइयों में परिवर्तित हो जाता है: 1 जनवरी, 1970

>>> np.datetime64(5, 'ns') 
numpy.datetime64('1970-01-01T00:00:00.000000005')

>>> np.datetime64(1508887504, 's')
numpy.datetime64('2017-10-24T23:25:04')

जब तक वे आईएसओ 8601 प्रारूप में हैं तब तक आप स्ट्रिंग्स का उपयोग कर सकते हैं।

>>> np.datetime64('2017-10-24')
numpy.datetime64('2017-10-24')

Timedeltas की एक एकल इकाई है

>>> np.timedelta64(5, 'D') # 5 days
>>> np.timedelta64(10, 'h') 10 hours

दो डेटाटाइम 64 ऑब्जेक्ट्स घटाकर भी उन्हें बना सकते हैं

>>> np.datetime64('2017-10-24T05:30:45.67') - np.datetime64('2017-10-22T12:35:40.123')
numpy.timedelta64(147305547,'ms')

पंडस टाइमस्टैम्प और टेमेडेल्टा न्यूमपी के शीर्ष पर बहुत अधिक कार्यक्षमता का निर्माण करते हैं

एक पांडा टाइमस्टैम्प एक समय में एक डेटाइम के समान है लेकिन बहुत अधिक कार्यक्षमता के साथ है। आप उन्हें pd.Timestampया तो निर्माण कर सकते हैं pd.to_datetime

>>> pd.Timestamp(1239.1238934) #defautls to nanoseconds
Timestamp('1970-01-01 00:00:00.000001239')

>>> pd.Timestamp(1239.1238934, unit='D') # change units
Timestamp('1973-05-24 02:58:24.355200')

>>> pd.Timestamp('2017-10-24 05') # partial strings work
Timestamp('2017-10-24 05:00:00')

pd.to_datetime बहुत समान रूप से काम करता है (कुछ और विकल्पों के साथ) और स्ट्रिंग्स की सूची को टाइमस्टैम्प में बदल सकता है।

>>> pd.to_datetime('2017-10-24 05')
Timestamp('2017-10-24 05:00:00')

>>> pd.to_datetime(['2017-1-1', '2017-1-2'])
DatetimeIndex(['2017-01-01', '2017-01-02'], dtype='datetime64[ns]', freq=None)

पायथन डेटाइम को डेटाइम 64 और टाइमस्टैम्प में परिवर्तित करना

>>> dt = datetime.datetime(year=2017, month=10, day=24, hour=4, 
                   minute=3, second=10, microsecond=7199)
>>> np.datetime64(dt)
numpy.datetime64('2017-10-24T04:03:10.007199')

>>> pd.Timestamp(dt) # or pd.to_datetime(dt)
Timestamp('2017-10-24 04:03:10.007199')

डेटाइम और टाइमस्टैम्प के लिए सुन्न datetime64 परिवर्तित

>>> dt64 = np.datetime64('2017-10-24 05:34:20.123456')
>>> unix_epoch = np.datetime64(0, 's')
>>> one_second = np.timedelta64(1, 's')
>>> seconds_since_epoch = (dt64 - unix_epoch) / one_second
>>> seconds_since_epoch
1508823260.123456

>>> datetime.datetime.utcfromtimestamp(seconds_since_epoch)
>>> datetime.datetime(2017, 10, 24, 5, 34, 20, 123456)

टाइमस्टैम्प में परिवर्तित करें

>>> pd.Timestamp(dt64)
Timestamp('2017-10-24 05:34:20.123456')

टाइमस्टैम्प से डेटाटाइम और डेटाटाइम 64 में परिवर्तित करें

यह काफी आसान है क्योंकि पांडा टाइमस्टैम्प बहुत शक्तिशाली हैं

>>> ts = pd.Timestamp('2017-10-24 04:24:33.654321')

>>> ts.to_pydatetime()   # Python's datetime
datetime.datetime(2017, 10, 24, 4, 24, 33, 654321)

>>> ts.to_datetime64()
numpy.datetime64('2017-10-24T04:24:33.654321000')

3
यह पागल है कि कैसे डेटाइम के लिए सुन्न अभी भी मुश्किल है / hacky ... वहाँ वास्तव में कोई बेहतर तरीका है? यह एक अच्छा जवाब है, मैं इसे शीर्ष स्तर पर ले जाने के बारे में सोच रहा हूं मुझे कंप्यूटर द्वारा एक बार दूसरों को अधिक गहराई से पढ़ना होगा।
एंडी हेडन

इसके बारे में इतना विचित्र क्या है? पंडों टाइमस्टैम्प अच्छी तरह से काम करते हैं और काफी सरल हैं।
टेड पेट्रोउ

2
Numpy to datetime।
एंडी हेडन

1
मुझे लगता है कि यह सबसे अच्छा जवाब है जो मैंने कभी देखा है। एक्सेल, वीबीए, एसएएस या एसक्यूएल से आता है, पायथन अजीब लगता है क्योंकि तारीखों / समय के साथ काम करने के लिए सिर्फ "एक ही रास्ता" नहीं है। पाइथन या आर में कई चीजों के साथ, ऐसा लगता है कि किसी को एक पसंदीदा विधि / मॉड्यूल / वर्ग चुनना होगा और उसके साथ रहना होगा।
शॉन मैककार्थी

अद्भुत एंकर
gioxc88

29
>>> dt64.tolist()
datetime.datetime(2012, 5, 1, 0, 0)

के लिए DatetimeIndex, वस्तुओं tolistकी एक सूची देता है datetime। किसी एक datetime64वस्तु के लिए यह एक ही datetimeवस्तु देता है ।


मुझे वास्तव में सभी तरीकों की कोशिश करनी चाहिए थी :) (मैं इस बात से हैरान हूं कि मैं कब तक इस एक के साथ जूझ रहा था) धन्यवाद
एंडी हेडन

5
@hayden यदि आप जानते हैं कि इसका अदिश / 0-d सरणी मैं उपयोग करूँगा .item()जो कि कहीं अधिक स्पष्ट है (और कोई भी आसपास नहीं आ सकता है और यह तर्क देना शुरू कर सकता है कि इसे एक सूची लौटानी चाहिए)।
14

1
मुझे डर है कि यह हमेशा काम करने के लिए प्रतीत नहीं होता है: उदाहरण के लिए dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100'), जो एक लंबा ( 1025222400000000000L) (!)
एंडी हेडन

4
@hayden: वह प्रकार जिसे .item()(@seberg द्वारा सुझाया गया है) द्वारा लौटाया जाता है , यह इस .tolist()बात पर निर्भर करता है कि datetime64 कौन सी इकाइयाँ उपयोग Dकरता है datetime.date(), जैसे , us(माइक्रोसेकंड) उत्पादन datetime.datetime(), ns(नैनोसेकंड) उत्पादन long। और इकाइयाँ इनपुट मानों के आधार पर बदलती हैं, जैसे, numpy.datetime64('2012-05-01')उपयोग 'D', numpy.datetime64('2012-05-01T00:00:00.000')उपयोग ms, numpy.datetime64('2012-05-01T00:00:00.000000000')उपयोग ns। यदि आप इसे भ्रामक पाते हैं तो आप एक मुद्दा खोल सकते हैं।
jfs 20

@AndyHayden आप केवल एक अतिरिक्त तर्क जोड़ सकते हैं, एक ही प्रारूप सुनिश्चित करने के लिए 'us' या 'ms' को लागू किया जा सकता है, जिसके परिणामस्वरूप एक ही डेटाटाइम तत्व tolist में उत्पादित किया जा रहा है ()
NM

11

यदि आप डेटेटाइम की एक पूरी पांडा श्रृंखला को नियमित रूप से डेटेटाइम में बदलना चाहते हैं, तो आप भी उपयोग कर सकते हैं .to_pydatetime()

pd.date_range('20110101','20110102',freq='H').to_pydatetime()

> [datetime.datetime(2011, 1, 1, 0, 0) datetime.datetime(2011, 1, 1, 1, 0)
   datetime.datetime(2011, 1, 1, 2, 0) datetime.datetime(2011, 1, 1, 3, 0)
   ....

यह टाइमज़ोन का भी समर्थन करता है:

pd.date_range('20110101','20110102',freq='H').tz_localize('UTC').tz_convert('Australia/Sydney').to_pydatetime()

[ datetime.datetime(2011, 1, 1, 11, 0, tzinfo=<DstTzInfo 'Australia/Sydney' EST+11:00:00 DST>)
 datetime.datetime(2011, 1, 1, 12, 0, tzinfo=<DstTzInfo 'Australia/Sydney' EST+11:00:00 DST>)
....

नोट : यदि आप पंडों की श्रृंखला पर काम कर रहे हैं तो आप to_pydatetime()पूरी श्रृंखला पर कॉल नहीं कर सकते । आपको .to_pydatetime()सूची बोध या कुछ समान का उपयोग करके प्रत्येक व्यक्ति के डेटाटाइम पर कॉल करना होगा :

datetimes = [val.to_pydatetime() for val in df.problem_datetime_column]

10

एक विकल्प का उपयोग करना है str, और फिर to_datetime(या समान):

In [11]: str(dt64)
Out[11]: '2012-05-01T01:00:00.000000+0100'

In [12]: pd.to_datetime(str(dt64))
Out[12]: datetime.datetime(2012, 5, 1, 1, 0, tzinfo=tzoffset(None, 3600))

नोट: यह "ऑफसेट-जागरूक"dt बनने के बराबर नहीं है :

In [13]: pd.to_datetime(str(dt64)).replace(tzinfo=None)
Out[13]: datetime.datetime(2012, 5, 1, 1, 0)

यह असंगत लगता है।

अद्यतन: यह "बुरा उदाहरण" से निपट सकता है:

In [21]: dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')

In [22]: pd.to_datetime(str(dt64)).replace(tzinfo=None)
Out[22]: datetime.datetime(2002, 6, 28, 1, 0)

इस टिप को साझा करने के लिए धन्यवाद एंडी। किसी कारण से मैं इसे काम करने में असमर्थ हूं, जैसा कि मैं यहां चर्चा करता हूं: stackoverflow.com/questions/22825349/…
Amelio Vazquez-Reina

@ user815423426 यह कभी भी बहुत मजबूत समाधान नहीं था, मुझे लगता है कि आप आम तौर पर अधिक काम करने के लिए डेटाइम कंस्ट्रक्टर के लिए एक प्रारूप पारित कर सकते हैं। हालांकि बहुत पैंडिस्टिक नहीं!
एंडी हेडन

8

इस पोस्ट को 4 साल हो गए हैं और मैं अभी भी इस रूपांतरण समस्या से जूझ रहा हूं - इसलिए यह मुद्दा अभी भी 2017 में कुछ अर्थों में सक्रिय है। मैं कुछ हैरान था कि सुन्न प्रलेखन आसानी से एक साधारण रूपांतरण एल्गोरिथ्म की पेशकश नहीं करता है, लेकिन यह एक और कहानी है।

मैं रूपांतरण करने के लिए दूसरे तरीके से आया हूं जिसमें केवल मॉड्यूल शामिल हैं numpyऔर datetime, इसे आयात करने के लिए पांडा की आवश्यकता नहीं होती है जो मुझे लगता है कि इस तरह के सरल रूपांतरण के लिए आयात करने के लिए बहुत सारे कोड हैं। मैंने देखा है कि datetime64.astype(datetime.datetime)एक वापस आ जाएगी datetime.datetimeवस्तु यदि मूल datetime64में है सूक्ष्म दूसरी इकाइयों , जबकि अन्य इकाइयों एक पूर्णांक टाइमस्टैम्प लौट आते हैं। मैं xarrayNetcdf फ़ाइलों से डेटा I / O के लिए मॉड्यूल का उपयोग करता हूं जो कि datetime64नैनोसेकंड इकाइयों में रूपांतरण को असफल बनाने का उपयोग करता है जब तक कि आप पहले सूक्ष्म-दूसरी इकाइयों में परिवर्तित नहीं होते हैं। यहाँ उदाहरण रूपांतरण कोड है,

import numpy as np
import datetime

def convert_datetime64_to_datetime( usert: np.datetime64 )->datetime.datetime:
    t = np.datetime64( usert, 'us').astype(datetime.datetime)
return t

इसका केवल मेरे मशीन पर परीक्षण किया गया, जो हाल ही में 2017 एनाकोंडा वितरण के साथ अजगर 3.6 है। मैंने केवल स्केलर रूपांतरण को देखा है और सरणी आधारित रूपांतरणों की जाँच नहीं की है, हालांकि मुझे लगता है कि यह अच्छा होगा। न ही मैंने यह देखने के लिए संख्यात्मक डेटाटाइम64 स्रोत कोड को देखा है कि ऑपरेशन समझ में आता है या नहीं।


यह भी खूब रही। इसे बनाने के लिए धन्यवाद।
यू चेन

अच्छी चीज़। धन्यवाद।
misantroop

1

मैं इस उत्तर पर अधिक बार आ सकता हूं जितना मैं गिन सकता हूं, इसलिए मैंने एक त्वरित छोटी कक्षा को एक साथ फेंकने का फैसला किया, जो datetime64कि पाइथन datetimeमूल्य के लिए एक Numpy मान को परिवर्तित करता है । मुझे उम्मीद है कि यह दूसरों को वहां से बाहर निकालने में मदद करता है।

from datetime import datetime
import pandas as pd

class NumpyConverter(object):
    @classmethod
    def to_datetime(cls, dt64, tzinfo=None):
        """
        Converts a Numpy datetime64 to a Python datetime.
        :param dt64: A Numpy datetime64 variable
        :type dt64: numpy.datetime64
        :param tzinfo: The timezone the date / time value is in
        :type tzinfo: pytz.timezone
        :return: A Python datetime variable
        :rtype: datetime
        """
        ts = pd.to_datetime(dt64)
        if tzinfo is not None:
            return datetime(ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second, tzinfo=tzinfo)
        return datetime(ts.year, ts.month, ts.day, ts.hour, ts.minute, ts.second)

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


2
आप बस कर सकते हैंts.to_pydatetime()
टेड पेट्रोउ

0
import numpy as np
import pandas as pd 

def np64toDate(np64):
    return pd.to_datetime(str(np64)).replace(tzinfo=None).to_datetime()

अजगर को देशी डेटाइम ऑब्जेक्ट प्राप्त करने के लिए इस फ़ंक्शन का उपयोग करें


मुझे यह कहते हुए एक त्रुटि हुईreplace() got an unexpected keyword argument 'tzinfo'
ogogmad

आप कौन से पांडा संस्करण का उपयोग करते हैं? मेरे पास संस्करण है: 0.18.1 (पाइप शो पांडा)
क्रिस्टल

आप ही की तरह। । ।
20.05 बजे ऑगोगमड ऑक्ट

मैं नहीं जानता, लेकिन यह मेरे लिए आकर्षण की तरह काम करता है। pix.toile-libre.org/upload/original/1475645621.png
क्रिस्टल

0

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

def format_dates(dates):
    dt = pd.to_datetime(dates)
    try: return [datetime.date(x.year, x.month, x.day) for x in dt]    
    except TypeError: return datetime.date(dt.year, dt.month, dt.day)

-1

वास्तव में, ये सभी डेटाटाइम प्रकार कठिन हो सकते हैं, और संभावित रूप से समस्याग्रस्त (समय-सीमा की जानकारी का ध्यान रखना चाहिए)। यहाँ मैंने क्या किया है, हालांकि मैं मानता हूं कि मुझे चिंता है कि इसका कम से कम हिस्सा "डिजाइन द्वारा नहीं" है। साथ ही, इसे आवश्यकतानुसार थोड़ा अधिक कॉम्पैक्ट बनाया जा सकता है। numpy.datetime64 dt_a से शुरू करना:

dt_a

numpy.datetime64 ( '2015-04-24T23: 11: 26.270000-0,700')

dt_a1 = dt_a.tolist () # UTC में एक डेटाइम ऑब्जेक्ट प्राप्त करता है, लेकिन tzfofo के बिना

dt_a1

datetime.datetime (2015, 4, 25, 6, 11, 26, 270000)

# now, make your "aware" datetime:

dt_a2 = datetime.datetime (* सूची (dt_a1.timetuple () [: 6]) + [dt_a1.microsecond], tzinfo = pytz.timezone ('UTC'))

... और निश्चित रूप से, जिसे एक पंक्ति में आवश्यकतानुसार संकुचित किया जा सकता है।


समयक्षेत्र हैंडलिंग में परिवर्तन के लिए docs.scipy.org/doc/numpy/reference/…
हंपुलज

कृपया editउचित के साथ अनुरूपित करें: कोड स्वरूपण, उद्धरण स्वरूपण और पाठ स्वरूपण। इसके अलावा, कृपया उचित पूंजीकरण, व्याकरण का पालन करें, और टाइपो के लिए जाँच करें, एसओ दिशानिर्देशों के अनुसार - देखें: पोस्ट कैसे करें , और कोड नमूने
शेरिलोहमन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.