การแปลงระหว่างวันที่และเวลา Timestamp และวันที่และเวลา 64


292

ฉันจะแปลง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')

หมายเหตุ: ง่ายต่อการรับ datetime จาก Timestamp:

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

แต่เราจะแยกdatetimeหรือTimestampจากnumpy.datetime64( dt64) ได้อย่างไร

.

อัปเดต: ตัวอย่างที่น่ารังเกียจในชุดข้อมูลของฉัน (อาจเป็นตัวอย่างของแรงจูงใจ):

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

ซึ่งควรจะdatetime.datetime(2002, 6, 28, 1, 0)และไม่นาน (!) ( 1025222400000000000L) ...


2
คุณอาจจะยอมรับคำตอบ @Wes McKinney ของที่สั้นมากและควรจะทำงานในที่ผ่านมาnumpy, pandasรุ่น
jfs

@JFSebastian อืมนั่นหมายความว่าคำตอบคือ "ไม่ได้ย้ายจาก np.datetime ไป datetime" ... เพียงแค่ใช้ pd.Timestamp (ตามที่มันเป็น subclass ของอยู่แล้ว datetime) pd.Timestamp(dt64).to_datetime()หรือถ้าคุณจริงๆต้องใช้ ฉันยังคงไม่พอใจเกี่ยวกับเรื่องนี้เล็กน้อย แต่แน่นอนว่าเวสสตรีทมีความเฉพาะเจาะจงน้อยกว่าปัญหาเก่าของฉัน (และดีกว่าสำหรับโลกนี้)! ขอขอบคุณอีกครั้งที่สละเวลาตอบ :)
Andy Hayden

คำถามของคุณพูดว่า"หรือTimestamp"และTimestampเป็นdatetime(subclass ของ) เลยล่ะค่ะ :)
jfs

3
สำหรับผู้ที่มาถึงคำถามนี้ในปี 2560 ลองดูคำตอบของฉันด้านล่างเพื่อรับการสอนแบบละเอียดของวันที่และเวลา, datetime64 และ Timestamps: stackoverflow.com/a/46921593/3707607
Ted Petrou

คำตอบ:


133

ในการแปลงnumpy.datetime64เป็นวัตถุ datetime ที่แสดงเวลาใน UTC บน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'

ตัวอย่างด้านบนถือว่าเป็นวัตถุ datetime ไร้เดียงสาถูกตีความโดยnp.datetime64เวลาใน UTC


ในการแปลงวันที่และเวลาเป็น np.datetime64 และย้อนกลับ ( numpy-1.6):

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

มันทำงานได้ทั้งบนวัตถุ np.datetime64 เดียวและอาเรย์ numpy ของ np.datetime64

คิดว่า np.datetime64 เช่นเดียวกับที่คุณทำเกี่ยวกับ np.int8, np.int16 และอื่น ๆ และใช้วิธีการเดียวกันในการแปลงระหว่างวัตถุ Python เช่น int, datetime และวัตถุที่สอดคล้องกัน

"ตัวอย่างที่น่ารังเกียจ" ของคุณทำงานอย่างถูกต้อง:

>>> 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บน

รับวัตถุ datetime คุณสามารถ:

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

ในการรับ datetime64 ที่ใช้วินาทีโดยตรง:

>>> 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) (!)
Andy Hayden

@hayden: type(dt64)ลอง dt64.astype(datetime) == datetime.utcfromtimestamp(dt64.astype(int)*1e-6)
jfs

@JFSebastian type(dt64)เป็นnumpy.datetime64และdt64.astype(datetime)เป็น int ที่เหมือนกันนาน ... : s
Andy Hayden

@hayden: รุ่นที่คุณชอบคืออะไร? เหมือง: numpy.__version__->'1.6.1'
jfs

เวอร์ชั่น 1.8.0 (ใน python 2.7.3) ถ้ามันเหมาะกับคุณมันแนะนำว่ามันเป็นจุดบกพร่องในระบบของฉัน!
Andy Hayden

212

คุณสามารถใช้ตัวสร้าง pd.Timestamp ไดอะแกรมต่อไปนี้อาจเป็นประโยชน์สำหรับคำถามนี้และคำถามที่เกี่ยวข้อง

การแปลงระหว่างการแสดงเวลา


2
นีซ !!! (ควรพูดถึงสถานการณ์ที่ดีขึ้นตั้งแต่ฉันเขียนคำถามนี้ไปทำงานมากมายที่นี่ :))
Andy Hayden

107
เพียงแค่ดูที่แผนภาพนี้บอกฉันว่ามีบางอย่างผิดปกติกับสิ่งนี้ตลอดเวลา
Hedgehog สมองเสื่อม

4
มันค่อนข้างสับสนว่า pd.to_datetime จะสร้าง TimeStamp ถ้าได้รับจำนวน ms หรือ ns แต่จะสร้าง datetime.datetime ถ้าได้รับ datetime.datetime หรือ np.datetime64 ถ้าได้รับ np.datetime64 ทำไม คิดว่านี่สมเหตุสมผลหรือไม่
Mr.WorshipMe

7
@ Mr.WorshipMe แผนภาพนี้ต้องมีการอัพเดท ทุกอย่างแปรรูปpd.to_datetime วัตถุจะมีวิธีการที่จะกลับไปยังวัตถุและวิธีการในการแปลง pd.Timestamppd.Timestampto_pydatetimedatetime.datetimeto_datetime64np.datetime64
Ted Petrou

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สามารถใช้งานได้ (นี่เป็นรุ่น dev ที่ยังไม่ได้ตรวจสอบ 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
Anton Protopopov

97

ฉันคิดว่าอาจมีความพยายามที่รวมกันมากขึ้นในการตอบเพื่ออธิบายความสัมพันธ์ระหว่างโมดูลวันที่และเวลาของ Python, datetime64 / timedelta64 และ numpy กับ Timestamp / Timedelta ของ pandas

ไลบรารีมาตรฐาน datetime ของ Python

ไลบรารีมาตรฐาน datetime มีสี่วัตถุหลัก

  • เวลา - เวลาเท่านั้นวัดเป็นชั่วโมงนาทีวินาทีและไมโครวินาที
  • วันที่ - เฉพาะปีเดือนและวัน
  • datetime - ส่วนประกอบทั้งหมดของเวลาและวันที่
  • timedelta - จำนวนเวลาที่มีหน่วยเป็นวันสูงสุด

สร้างวัตถุทั้งสี่นี้

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

วัตถุ datetime64 และ timedelta64 ของ NumPy

NumPy ไม่มีวัตถุวันที่และเวลาที่แยกกันเพียงแค่วัตถุ datetime64 เดียวเพื่อแสดงช่วงเวลาหนึ่ง วัตถุ datetime ของโมดูล datetime มีความแม่นยำระดับไมโครวินาที (หนึ่งในล้านของวินาที) วัตถุ datetime64 ของ NumPy ช่วยให้คุณสามารถตั้งค่าความแม่นยำของมันได้จากหลายชั่วโมงไปจนถึง attoseconds (10 ^ -18) มันเป็นคอนสตรัคเตอร์มีความยืดหยุ่นมากกว่าและสามารถรับอินพุตได้หลากหลาย

สร้างวัตถุ datetime64 และ timedelta64 ของ NumPy

ส่งจำนวนเต็มด้วยสตริงสำหรับหน่วย ดูทุกหน่วยงานที่นี่ มันถูกแปลงเป็นหน่วยจำนวนมากหลังจากยุค 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')

คุณยังสามารถใช้สตริงได้ตราบใดที่มันอยู่ในรูปแบบ ISO 8601

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

Timedeltas มีหน่วยเดียว

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

ยังสามารถสร้างพวกเขาโดยการลบวัตถุสอง datetime64

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

Pandas Timestamp และ Timedelta สร้างฟังก์ชันการทำงานอื่น ๆ อีกมากมายที่ด้านบนของ NumPy

Timestamp ของแพนด้าเป็นช่วงเวลาที่คล้ายกับเวลาและมีการใช้งานมากกว่า คุณสามารถสร้างพวกเขาด้วยอย่างใดอย่างหนึ่งหรือpd.Timestamppd.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 ทำงานคล้ายกันมาก (มีตัวเลือกน้อย) และสามารถแปลงรายการสตริงเป็น Timestamps

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

การแปลงวันที่และเวลา Python เป็น datetime64 และ Timestamp

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

การแปลง numpy datetime64 เป็น datetime และ Timestamp

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

แปลงเป็น Timestamp

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

แปลงจาก Timestamp เป็น datetime และ datetime64

ค่อนข้างง่ายเนื่องจากการประทับเวลาของนุ่นมีประสิทธิภาพมาก

>>> 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
มันบ้าวิธีที่ numpy ไปยัง datetime ยังคงเป็นเรื่องยาก / แฮ็ค ... ไม่มีวิธีที่ดีกว่าจริง ๆ ? นี่เป็นคำตอบที่ดีฉันคิดว่าจะยอมรับที่จะย้ายไปยังระดับสูงสุดที่ฉันต้องอ่านคนอื่นอย่างลึกซึ้งยิ่งขึ้นโดยคอมพิวเตอร์
Andy Hayden

มีอะไรแปลก ๆ เกี่ยวกับมัน? Pandas Timestamps ทำงานได้ดีและค่อนข้างง่าย
Ted Petrou

2
Numpy เป็น datetime
Andy Hayden

1
ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุดที่ฉันเคยเห็น มาจาก Excel, VBA, SAS หรือ SQL, Python ดูเหมือนจะแปลกเพราะไม่มี "ทางเดียว" ในการทำงานกับวันที่ / เวลา เช่นเดียวกับหลาย ๆ สิ่งใน Python หรือ R ดูเหมือนว่าเราจะต้องเลือกวิธีการ / โมดูล / คลาสที่ชอบและติดกับมัน
Sean McCarthy

ท่อระบายน้ำที่น่าตื่นตาตื่นใจ
gioxc88

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

สำหรับDatetimeIndexการtolistคืนค่ารายการของdatetimeวัตถุ สำหรับdatetime64วัตถุเดียวจะส่งคืนdatetimeวัตถุเดียว


ฉันควรลองวิธีการทั้งหมดแล้ว :) (ฉันตกใจมากที่ฉันต้องต่อสู้กับมันนานเท่าไหร่) ขอบคุณ
Andy Hayden

5
@Hayden ถ้าคุณรู้ว่ามันเป็นสเกลาร์ / 0-d อาเรย์ฉันค่อนข้างจะใช้.item()ซึ่งเป็นที่ชัดเจนมากขึ้น (และไม่มีใครสามารถมารอบและเริ่มเถียงว่ามันควรจะกลับรายการ)
seberg

1
ฉันกลัวว่านี่อาจจะไม่ได้ผลเสมอไปตัวอย่างเช่นdt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')ซึ่งให้เวลานาน ( 1025222400000000000L) (!)
Andy Hayden

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

@AndyHayden คุณสามารถเพิ่มอาร์กิวเมนต์พิเศษ 'us' หรือ 'ms' เพื่อให้แน่ใจว่ามีการใช้รูปแบบเดียวกันส่งผลให้องค์ประกอบ datetime เดียวกันถูกสร้างขึ้นใน tolist ()
NM

11

หากคุณต้องการแปลงชุดหมีแพนด้าทั้งหมดของ datetimes เพื่อ datetimes .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>)
....

หมายเหตุ : หากคุณใช้งานกับซีรี่ย์ Pandas คุณจะไม่สามารถโทรหาto_pydatetime()ทั้งซีรีส์ได้ คุณจะต้องโทรหา.to_pydatetime()datetime64 แต่ละรายการโดยใช้ list comprehension หรือสิ่งที่คล้ายกัน:

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เพราะกลายเป็น"offset-aware" :

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)

ขอบคุณ Andy ที่แบ่งปันเคล็ดลับนี้ ด้วยเหตุผลบางอย่างฉันไม่สามารถทำงานได้ตามที่ฉันพูดคุยที่นี่: stackoverflow.com/questions/22825349/ …
Amelio Vazquez-Reina

@ user815423426 นี้ไม่เคยเป็นโซลูชั่นที่แข็งแกร่งมากฉันเดาว่าคุณสามารถส่งรูปแบบไปยังตัวสร้าง datetime เพื่อทำงานโดยทั่วไป แม้ว่าจะไม่ได้เป็น pandastic มาก!
Andy Hayden

8

โพสต์นี้ดำเนินมาเป็นเวลา 4 ปีและฉันยังคงดิ้นรนกับปัญหาการแปลงนี้ - ดังนั้นจึงยังคงมีปัญหาในปี 2560 ในบางแง่มุม ฉันค่อนข้างตกใจว่าเอกสาร numpy ไม่ได้นำเสนออัลกอริทึมการแปลงอย่างง่าย แต่เป็นอีกเรื่องหนึ่ง

ฉันได้เจอวิธีอื่นในการทำ Conversion ที่เกี่ยวข้องกับโมดูลเท่านั้นnumpyและdatetimeไม่ต้องการให้นำเข้าแพนด้าซึ่งฉันคิดว่าเป็นรหัสจำนวนมากที่จะนำเข้าสำหรับการแปลงอย่างง่าย ฉันสังเกตเห็นว่าdatetime64.astype(datetime.datetime)จะส่งคืนdatetime.datetimeวัตถุถ้าต้นฉบับdatetime64อยู่ในหน่วยไมโครวินาทีในขณะที่หน่วยอื่น ๆ ส่งคืนค่าจำนวนเต็ม ฉันใช้โมดูลxarrayสำหรับข้อมูล I / O จากไฟล์ Netcdf ซึ่งใช้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

มันทดสอบเฉพาะในเครื่องของฉันซึ่งก็คือ Python 3.6 พร้อมการกระจาย Anaconda ในปี 2560 ที่ผ่านมา ฉันดูที่การแปลงสเกลาร์เท่านั้นและไม่ได้ตรวจสอบ Conversion จากอาเรย์แม้ว่าฉันเดาว่ามันจะดี ฉันไม่ได้ดูซอร์สโค้ดของ datetime64 แบบ numpy เพื่อดูว่าการดำเนินการเหมาะสมหรือไม่


มันเยี่ยมมาก ขอบคุณที่ทำสิ่งนี้
Yu Chen

สิ่งที่ดี. ขอบคุณ.
misantroop

1

ฉันได้กลับมาที่คำตอบนี้ครั้งกว่าฉันจะนับดังนั้นฉันตัดสินใจที่จะโยนกันระดับเล็ก ๆ น้อย ๆ อย่างรวดเร็วซึ่งแปลง Numpy datetime64มูลค่าให้กับงูหลามdatetimeค่า ฉันหวังว่ามันจะช่วยให้คนอื่นออกไปที่นั่น

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()
Ted Petrou

0
import numpy as np
import pandas as pd 

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

ใช้ฟังก์ชั่นนี้เพื่อรับวัตถุของ datetime ดั้งเดิมของ pythons


ฉันพบข้อผิดพลาดreplace() got an unexpected keyword argument 'tzinfo'
ogogmad

คุณใช้แพนด้าเวอร์ชันไหนฉันมีเวอร์ชั่น: 0.18.1 (pip pip pandas)
Crystal

เช่นเดียวกับคุณ. . .
ogogmad

ฉันไม่รู้แล้ว แต่มันเหมาะกับฉันที่มีเสน่ห์ pix.toile-libre.org/upload/original/1475645621.png
Crystal

0

วิธีแก้ปัญหาบางอย่างทำงานได้ดีสำหรับฉัน แต่ numpy จะลดค่าพารามิเตอร์บางอย่าง วิธีแก้ปัญหาที่ใช้งานได้ดีกว่าสำหรับฉันคือการอ่านวันที่เป็นวันที่ของแพนด้าและแยกออกจากกันอย่างชัดเจนทั้งปีเดือนและวันของวัตถุแพนด้า รหัสต่อไปนี้ใช้ได้กับสถานการณ์ที่พบบ่อยที่สุด

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 () # ให้ผลตอบแทนวัตถุ datetime ใน UTC แต่ไม่มี tzinfo

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/…สำหรับการเปลี่ยนแปลงการจัดการเขตเวลา
hpaulj

โปรดeditปฏิบัติตามความเหมาะสม: การจัดรูปแบบโค้ดการจัดรูปแบบการอ้างและการจัดรูปแบบข้อความ นอกจากนี้โปรดปฏิบัติตามการใช้ตัวพิมพ์ใหญ่ให้ถูกต้องไวยากรณ์และตรวจสอบความผิดพลาดตามแนวทางของ SO - ดู: วิธีการโพสต์และตัวอย่างโค้ด
SherylHohman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.