ডেটটাইম, টাইমস্ট্যাম্প এবং ডেটটাইম 64 এর মধ্যে রূপান্তর


289

আমি কীভাবে কোনও 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)

কিন্তু আমরা কিভাবে বের করবেন datetimeবা TimestampA থেকে numpy.datetime64( dt64)?

আপডেট: আমার ডেটাসেটে কিছুটা বাজে উদাহরণ (সম্ভবত উদ্বুদ্ধকারী উদাহরণ) বলে মনে হচ্ছে:

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

যা হওয়া উচিত datetime.datetime(2002, 6, 28, 1, 0), এবং দীর্ঘ নয় (!) ( 1025222400000000000L) ...


2
আপনি সম্ভবত গ্রহণ করা উচিত @Wes ম্যাককিনি এর উত্তর যে অনেক খাটো এবং সাম্প্রতিক কাজ করা উচিত numpy, pandasসংস্করণ।
jfs

@ জেফাসেবাস্টিয়ান হুমম, এর অর্থ কি এই উত্তরটি "এনপি.ডেটটাইম থেকে ডেটটাইমে চলে না" ... কেবল পিডি.টাইমস্ট্যাম্প ব্যবহার করুন (এটি কোনওভাবেই ডেটটাইমের একটি সাবক্লাস হিসাবে), অথবা যদি আপনার সত্যিকারের ব্যবহার অবশ্যই হয় pd.Timestamp(dt64).to_datetime()। আমি এখনও এ সম্পর্কে কিছুটা অসন্তুষ্ট, তবে অবশ্যই ওয়েস আমার পুরানো সমস্যার সাথে কম সুনির্দিষ্ট নয় (এবং বিশ্বের পক্ষে আরও ভাল)! এর উত্তর দিতে সময় দেওয়ার জন্য আবার ধন্যবাদ Thanks :)
অ্যান্ডি হেডেন

আপনার প্রশ্নটি "বা Timestamp" বলে এবং যাইহোক Timestampএটি একটি datetime(একটি উপশ্রেণী) :)
jfs

3
2017+ এ এই প্রশ্নে যারা আসছেন তাদের জন্য ডেটটাইম, ডেটটাইম 64 এবং টাইমস্ট্যাম্পগুলির বিশদ টিউটোরিয়ালের জন্য নীচে আমার উত্তরটি দেখুন: stackoverflow.com/a/46921593/3707607
টেড পেট্রো

উত্তর:


132

numpy.datetime64ডেটটাইম অবজেক্টে রূপান্তর করতে যা ইউটিসিতে সময়কে উপস্থাপন করে 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.datetime64ইউটিসিতে সময় হিসাবে ব্যাখ্যা করা হয় ।


ডেটটাইমকে এনপি.ডেটটাইম 64 এবং পিছনে ( numpy-1.6) এ রূপান্তর করতে :

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

এটি একটি একক এনপি.ডেটটাইম 64৪ টি বস্তু এবং এনপি.ডেটটাইম 64৪ of এর একটি অলস অ্যারে উভয় ক্ষেত্রেই কাজ করে।

এনপি.ডেটটাইম 64 কে একইভাবে এনপি.আইন্ট 8, এনপি.আইএন 16 ইত্যাদি সম্পর্কে ভাবুন এবং পাইথন অবজেক্ট যেমন ইনট, ডেটটাইম এবং আনুষঙ্গিক অবজেক্ট অবজেক্টগুলিতে রূপান্তর করতে একই পদ্ধতি প্রয়োগ করুন।

আপনার "বাজে উদাহরণ" সঠিকভাবে কাজ করে:

>>> 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 ডক্স বলে যে DATETIME API পরীক্ষামূলক এবং ভবিষ্যতে numpy সংস্করণে পরিবর্তন হতে পারে।


1
আমি ভীত এটি সবসময় কাজ করে না বলে মনে হয়: যেমন dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100'), যা একটি দীর্ঘ ( 1025222400000000000L) (!) দেয়
অ্যান্ডি হেডেন

@hayden: চেষ্টা type(dt64)dt64.astype(datetime) == datetime.utcfromtimestamp(dt64.astype(int)*1e-6)
jfs

@ জেফেসেবাস্টিয়ান type(dt64)হচ্ছেন numpy.datetime64এবং dt64.astype(datetime)একই দীর্ঘ অন্তর্নিহিত ...: s
অ্যান্ডি

@ হাইডেন: আপনার অদ্ভুত সংস্করণটি কী? খনি: numpy.__version__->'1.6.1'
jfs

সংস্করণ ১.৮.০ (পাইথন ২.7.৩ এ), যদি এটি আপনার পক্ষে কাজ করে তবে এটি এটি আমার সিস্টেমে একটি ত্রুটিপূর্ণ পরামর্শ দেয়!
অ্যান্ডি হেডেন

211

আপনি কেবল pd.Timestamp নির্মাণকারী ব্যবহার করতে পারেন। নিম্নলিখিত চিত্রটি এটি এবং সম্পর্কিত প্রশ্নের জন্য কার্যকর হতে পারে।

সময়ের উপস্থাপনার মধ্যে রূপান্তর


2
নিস !!! (আমি এই প্রশ্নটি লেখার পর থেকে পরিস্থিতি উন্নত হয়েছে উল্লেখ করে, এখানে প্রচুর কাজ করা হয়েছে :))
অ্যান্ডি হেডেন

106
কেবল এই চিত্রটি দেখে আমাকে জানায় যে এই সময়ের সমস্ত জিনিসগুলির সাথে মূলত কিছু ভুল আছে।
হেমেজহোগকে

4
এটি অত্যন্ত বিভ্রান্তিকর যে পিডি টু ডেটটাইম একটি এমএস বা এনএস সংখ্যা দিলে একটি টাইমস্ট্যাম্প তৈরি করে তবে একটি ডেটটাইম.ডেটটাইম উত্পন্ন করে যদি একটি ডেটটাইম.ডেটটাইম বা একটি এনপি.ডেটটাইম 64 দেওয়া হয় যদি কোনও এনপি.ডেটটাইম 64 দেওয়া হয় ... কেন কেউ হবে? এটা কি যুক্তিসঙ্গত মনে হয়?
মিঃ ওয়ার্সশিপ

7
@ মিঃ ওয়ার্সশিপমাম এই চিত্রটি আপডেট করা দরকার। pd.to_datetimeসবকিছুতে রূপান্তর করে pd.Timestamp। একটি pd.Timestampবস্তুর পন্থা নেই to_pydatetimeএকটি ফিরে রূপে ফিরিয়ে নিয়ে যেতে datetime.datetimeবস্তু এবং একটি to_datetime64রূপান্তর পদ্ধতি np.datetime64
টেড পেট্রো

2
আমি কীভাবে এই পিকটির উচ্চতর রেজোলিউশন পেতে পারি?
ব্যবহারকারীর 22226167

136

নরকে স্বাগতম.

আপনি কেবল একটি ডেটটাইম 64৪ টি বস্তুটি এখানে পাস করতে পারেন 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
আন্তন প্রোটোপোভোভ

96

আমি মনে করি পাইথনের ডেটটাইম মডিউল, নম্পির ডেটটাইম /৪ / টাইমডেলটা p৪ এবং পান্ডসের টাইমস্ট্যাম্প / টাইমডেল্টা অবজেক্টের মধ্যে সম্পর্কের আরও ভালভাবে ব্যাখ্যা করার উত্তরে আরও একীভূত প্রচেষ্টা হতে পারে।

পাইথনের ডেটটাইম স্ট্যান্ডার্ড লাইব্রেরি

ডেটটাইম স্ট্যান্ডার্ড লাইব্রেরিতে চারটি প্রধান অবজেক্ট রয়েছে

  • সময় - কেবলমাত্র সময়, ঘন্টা, মিনিট, সেকেন্ড এবং মাইক্রোসেকেন্ডে পরিমাপ করা হয়
  • তারিখ - শুধুমাত্র বছর, মাস এবং দিন
  • তারিখ সময় - সময় এবং তারিখের সমস্ত উপাদান
  • টাইমডেল্টা - সর্বাধিক দিনের একক পরিমাণ সময়

এই চারটি অবজেক্ট তৈরি করুন

>>> 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 এর তারিখের সময় 64 এবং টাইমডেলটা 64 অবজেক্ট

NumPy এর কোনও পৃথক তারিখ এবং সময় অবজেক্ট নেই, সময়টিতে একটি মুহুর্ত উপস্থাপনের জন্য কেবল একটি ডেটটাইম 64৪ টি অবজেক্ট। ডেটটাইম মডিউলটির ডেটটাইম অবজেক্টে মাইক্রোসেকেন্ড যথার্থতা (এক সেকেন্ডের দশ মিলিয়ন)। নুমপির ডেটটাইম 64৪ অবজেক্ট আপনাকে ঘন্টা থেকে পুরোপুরি অ্যাটিসেকেন্ডে (10 ^ -18) সেট করার জন্য অনুমতি দেয়। এটি নির্মাণকারী আরও নমনীয় এবং বিভিন্ন ইনপুট নিতে পারে।

NumPy এর তারিখের সময় 64 এবং টাইমডেলটা 64 অবজেক্টগুলি তৈরি করুন

ইউনিটগুলির জন্য একটি স্ট্রিং সহ একটি পূর্ণসংখ্যা পাস করুন। সমস্ত ইউনিট এখানে দেখুন । এটি 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')

টাইমডেল্টসের একটি ইউনিট রয়েছে

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

দুটি ডেটটাইম time৪ টি বস্তু বিয়োগ করে এগুলিও তৈরি করতে পারে

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

ন্যালি ডেটটাইম 64 কে ডেটটাইম এবং টাইমস্ট্যাম্পে রূপান্তর করা

>>> 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
এটা পাগল যে ডেটটাইম অবধি এখনও শক্ত / হ্যাকি ... এর চেয়ে ভাল উপায় আর কি নেই? এটি একটি উত্তরের উত্তর, আমি এটিকে শীর্ষ স্তরে নিয়ে যেতে মেনে নেওয়ার কথা ভাবছি আমাকে অন্য কম্পিউটারে আরও গভীরভাবে পড়তে হবে।
অ্যান্ডি হেইডেন

এটি সম্পর্কে এত উদ্বেগ কি? পান্ডাস টাইমস্ট্যাম্পগুলি ভাল কাজ করে এবং মোটামুটি সহজ।
টেড পেট্রো

2
খাঁটি থেকে ডেটটাইম।
অ্যান্ডি হেডেন

1
আমি মনে করি এটি আমার দেখা সেরা উত্তর। এক্সেল, ভিবিএ, এসএএস বা এসকিউএল থেকে আগত পাইথনটি অদ্ভুত বলে মনে হচ্ছে কারণ খেজুর / সময় নিয়ে কাজ করার জন্য কেবল "একটি উপায়" নেই। পাইথন বা আর-এর অনেক কিছুর মতোই মনে হয় যে কোনও একটি অবশ্যই একটি পছন্দসই পদ্ধতি / মডিউল / শ্রেণি বেছে নিতে এবং এটির সাথে লেগে থাকা উচিত।
শান ম্যাকার্থি

আশ্চর্যজনক নতুন অনুসন্ধান
gioxc88

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

জন্য DatetimeIndex, অবজেক্টগুলির tolistএকটি তালিকা প্রদান datetimeকরে। একটি একক datetime64বস্তুর জন্য এটি একটি একক datetimeবস্তু ফেরত দেয় ।


আমার সত্যিই সমস্ত পদ্ধতিটি চেষ্টা করা উচিত ছিল :) (আমি কতক্ষণ ধরে এই সাথে জড়িত ছিলাম তাতে আমি হতবাক হয়েছি) ধন্যবাদ
অ্যান্ডি হেডেন

5
@ হাইডেন আপনি যদি জানেন যে এটির একটি স্কেলার / 0-ডি অ্যারের পরিবর্তে আমি এর চেয়ে .item()বেশি স্পষ্টত ব্যবহার করব (এবং কেউই আশেপাশে এসে বিতর্ক শুরু করতে পারে না যে এটি একটি তালিকা ফিরিয়ে দেবে)।
সেবার্গ

1
আমি ভীত এটি সবসময় কাজ করে না বলে মনে হয়: যেমন dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100'), যা একটি দীর্ঘ ( 1025222400000000000L) (!) দেয়
অ্যান্ডি হেডেন

4
@ হাইডেন: যে ধরণের ফিরিয়ে দেওয়া হয়েছে .item()(@ সেবার্গ দ্বারা প্রস্তাবিত), ডেটটাইম 64৪ উদাহরণগুলি .tolist()কীভাবে 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

@ অ্যান্ডি হেডেন আপনি একই মাত্রা প্রয়োগের ফলস্বরূপ টোলিস্টে উত্পাদিত হওয়ার ফলস্বরূপ প্রয়োগ করার জন্য 'আমরা' বা 'এমএস' কেবল একটি অতিরিক্ত যুক্তি যুক্ত করতে পারেন ()
এনএম

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()তালিকা স্বীকৃতি বা অনুরূপ কিছু ব্যবহার করে প্রতিটি স্বতন্ত্র তারিখের সময় 64 এ কল করতে হবে :

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/…
আমেলিও ওয়াজকেজ-রেইনা

@ ইউজার 815423426 এটি খুব শক্ত সমাধান কখনই ছিল না, আমার ধারণা আপনি আরও সাধারণভাবে কাজ করার জন্য ডেটটাইম কনস্ট্রাক্টরের কাছে কোনও ফর্ম্যাট দিতে পারেন। যদিও খুব পণ্ডিক নয়!
অ্যান্ডি হেডেন

8

এই পোস্টটি 4 বছর ধরে চলেছে এবং আমি এখনও এই রূপান্তর সমস্যার সাথে লড়াই করেছি - সুতরাং এই সমস্যাটি এখনও কিছুটা অর্থে 2017 সালে সক্রিয়। আমি কিছুটা হতবাক হয়ে গিয়েছিলাম যে নাম্বার ডকুমেন্টেশনগুলি সহজেই একটি সাধারণ রূপান্তর অ্যালগরিদম সরবরাহ করে না তবে এটি অন্য গল্প।

আমি রূপান্তরটি করার জন্য অন্য উপায়টি পেরিয়ে এসেছি যাতে কেবলমাত্র মডিউলগুলি জড়িত থাকে numpyএবং এর datetimeজন্য পান্ডাস আমদানির প্রয়োজন হয় না যা এ জাতীয় সরল রূপান্তরটির জন্য আমদানি করার জন্য আমার কাছে প্রচুর কোড বলে মনে হয়। আমি লক্ষ্য করেছি যে datetime64.astype(datetime.datetime)একটি ফিরে আসবে datetime.datetimeবস্তুর যদি মূল datetime64রয়েছে মাইক্রো সেকেন্ডের ইউনিট যখন অন্যান্য ইউনিট একটি পূর্ণসংখ্যা টাইমস্ট্যাম্প ফিরে যান। আমি xarrayনেটকডিএফ ফাইলগুলি থেকে আই / ও ডেটার জন্য মডিউল ব্যবহার করি যা 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 উত্স কোডের দিকেও নজর রাখিনি।


এটা অসাধারণ. এটি করার জন্য আপনাকে ধন্যবাদ।
ইউ চেন

ভাল জিনিস. ধন্যবাদ.
মিসানট্রুপ

1

আমি গুনতে পারার চেয়ে আরও বেশি বার এই উত্তরে ফিরে এসেছি, তাই আমি সিদ্ধান্ত নিয়েছিলাম একটি দ্রুত সামান্য ক্লাস, যা একটি নিম্পি datetime64মানকে পাইথনের datetimeমানকে রূপান্তর করে throw আমি আশা করি এটি অন্যকে এখানে সহায়তা করবে।

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 (পিপ শো প্যান্ডাস)
ক্রিস্টাল

তোমার মত. । ।
ogogmad

আমি তখন জানি না তবে এটি আমার জন্য কবজির মতো কাজ করে। 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

প্রকৃতপক্ষে, এই ডেটটাইম ধরণের সমস্তগুলি জটিল এবং সম্ভাব্য সমস্যা হতে পারে (অবশ্যই টাইমজোন সম্পর্কিত তথ্যের যত্নবান ট্র্যাক রাখতে হবে)। আমি এখানে যা করেছি তা এখানে দেওয়া হয়েছে, যদিও আমি স্বীকার করি যে আমি উদ্বিগ্ন যে এর কমপক্ষে অংশটি "নকশার দ্বারা নয়"। এছাড়াও, এটি প্রয়োজন হিসাবে আরও কিছুটা কমপ্যাক্ট করা যেতে পারে। একটি নম্পি.ডেটটাইম 64 ডিটি_এ দিয়ে শুরু:

dt_a

numpy.datetime64 ( '2015-04-24T23: 11: 26.270000-0700')

dt_a1 = dt_a.tolist () # ইউটিসিতে একটি ডেটটাইম অবজেক্ট দেয় তবে tzinfo ছাড়াই

dt_a1

ডেটটাইম.ডেটটাইম (2015, 4, 25, 6, 11, 26, 270000)

# now, make your "aware" datetime:

dt_a2 = ডেটটাইম.ডেটটাইম (* তালিকা (dt_a1.Timetuple () [: 6]) + [dt_a1.microsecond], tzinfo = pytz.timezone ('ইউটিসি'))

... এবং অবশ্যই, এটি প্রয়োজন হিসাবে এক লাইনে সংকুচিত করা যেতে পারে।


টাইমজোন হ্যান্ডলিংয়ের পরিবর্তনের জন্য ডকস.স্কিপি.আর
এইচপিউলজ

editযথাযথ: কোড বিন্যাসকরণ, উদ্ধৃতি ফর্ম্যাটিং এবং পাঠ্য ফর্ম্যাটিংয়ের সাথে মানিয়ে নিতে দয়া করে। এছাড়াও, দয়া করে যথাযথ মূলধন, ব্যাকরণ মেনে
চলেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.