Chuyển đổi giữa datetime, Dấu thời gian và datetime64


290

Làm cách nào để chuyển đổi một numpy.datetime64đối tượng thành một datetime.datetime(hoặcTimestamp )?

Trong đoạn mã sau, tôi tạo một đối tượng datetime, dấu thời gian và datetime64.

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

Lưu ý: thật dễ dàng để lấy thời gian từ Dấu thời gian:

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

Nhưng làm thế nào để chúng tôi trích xuất datetimehoặc Timestamptừ một numpy.datetime64(dt64 )?

.

Cập nhật: một ví dụ hơi khó chịu trong tập dữ liệu của tôi (có lẽ là ví dụ tạo động lực) dường như là:

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

mà nên datetime.datetime(2002, 6, 28, 1, 0), và không dài (!) ( 1025222400000000000L) ...


2
có lẽ bạn nên chấp nhận câu trả lời @Wes McKinney của đó là ngắn hơn nhiều và cần làm việc trên gần đây numpy, pandascác phiên bản.
jfs

@JFSebastian Hmmm, điều đó có nghĩa là câu trả lời là "đừng chuyển từ np.datetime sang datetime" ... chỉ cần sử dụng pd.Timestamp (vì dù sao nó cũng là một lớp con của datetime) hoặc nếu bạn thực sự phải sử dụng pd.Timestamp(dt64).to_datetime(). Tôi vẫn không hài lòng về điều này, nhưng chắc chắn Wes 'ít cụ thể hơn đối với vấn đề cũ của tôi (và vì thế tốt hơn cho thế giới)! Cảm ơn một lần nữa vì đã dành thời gian để trả lời nó. :)
Andy Hayden

Câu hỏi của bạn nói "hoặc Timestamp" và dù sao cũng Timestampdatetime(một lớp con) :)
jfs

3
Đối với những người đến với câu hỏi này trong năm 2017+, hãy xem câu trả lời của tôi dưới đây để biết hướng dẫn chi tiết về datetime, datetime64 và Dấu thời gian: stackoverflow.com/a/46921593/3707607
Ted Petrou

Câu trả lời:


132

Để chuyển đổi numpy.datetime64thành đối tượng datetime biểu thị thời gian trong UTC trên 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'

Ví dụ trên giả định rằng một đối tượng datetime ngây thơ được hiểu theo np.datetime64thời gian trong UTC.


Để chuyển đổi datetime thành np.datetime64 và back ( numpy-1.6):

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

Nó hoạt động cả trên một đối tượng np.datetime64 và một mảng nump.datetime64.

Hãy nghĩ về np.datetime64 giống như cách bạn làm về np.int8, np.int16, v.v. và áp dụng các phương thức tương tự để chuyển đổi giữa các đối tượng Python như int, datetime và các đối tượng numpy tương ứng.

"Ví dụ khó chịu" của bạn hoạt động chính xác:

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

Tôi có thể sao chép longgiá trị numpy-1.8.0được cài đặt như:

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

Ví dụ tương tự:

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

Nó trả về longnumpy.datetime64kiểu .astype(datetime)tương đương với kiểu .astype(object)trả về số nguyên Python ( long) trên numpy-1.8.

Để có được đối tượng datetime bạn có thể:

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

Để nhận datetime64 sử dụng giây trực tiếp:

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

Các tài liệu numpy nói rằng API datetime là thử nghiệm và có thể thay đổi trong các phiên bản numpy trong tương lai.


1
Tôi e rằng điều này dường như không phải lúc nào cũng hoạt động: ví dụ: dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')điều này mang lại một thời gian dài ( 1025222400000000000L) (!)
Andy Hayden

@hayden: thử đi type(dt64). dt64.astype(datetime) == datetime.utcfromtimestamp(dt64.astype(int)*1e-6)
jfs

@JFSebastian type(dt64)numpy.datetime64dt64.astype(datetime)cùng một int dài ...: s
Andy Hayden

@hayden: Phiên bản numpy của bạn là gì? Của tôi: numpy.__version__->'1.6.1'
jfs

Phiên bản 1.8.0 (trong python 2.7.3), nếu nó hoạt động cho bạn, điều đó cho thấy đó là một lỗi trên hệ thống của tôi!
Andy Hayden

212

Bạn chỉ có thể sử dụng hàm tạo pd.Timestamp. Sơ đồ sau đây có thể hữu ích cho điều này và các câu hỏi liên quan.

Chuyển đổi giữa các biểu diễn thời gian


2
Đẹp!!! (Đáng nói là tình hình đã được cải thiện kể từ khi tôi viết câu hỏi này, rất nhiều công việc đã được thực hiện ở đây :))
Andy Hayden

106
Chỉ cần nhìn vào sơ đồ này cho tôi biết có điều gì đó về cơ bản là sai với tất cả những thứ thời gian này.
con nhím mất trí

4
Thật khó hiểu khi pd.to_datetime sẽ tạo ra TimeStamp nếu được cung cấp số ms hoặc ns, nhưng sẽ tạo ra datetime.datetime nếu được cung cấp datetime.datetime hoặc np.datetime64 nếu được cung cấp np.datetime64 ... Tại sao mọi người sẽ nghĩ điều này có hợp lý không?
Mr.WourMe

7
@ Mr.WISTMe Sơ đồ này cần được cập nhật. pd.to_datetimechuyển đổi mọi thứ thành pd.Timestamp. Một pd.Timestampđối tượng có phương thức to_pydatetimeđể trở lại một datetime.datetimeđối tượng và một to_datetime64phương thức để chuyển đổi thành np.datetime64.
Ted Petrou

2
Làm thế nào tôi có thể có được độ phân giải cao hơn của pic này?
dùng3226167

137

Chào mừng đến với địa ngục.

Bạn chỉ có thể truyền một đối tượng datetime64 tới pandas.Timestamp:

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

Tôi nhận thấy rằng điều này không hoạt động đúng mặc dù trong NumPy 1.6.1:

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

Ngoài ra, pandas.to_datetimecó thể được sử dụng (đây là phiên bản dev, chưa được kiểm tra 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
Bạn nên đề cập đến rằng issubclass(pd.Timestamp, datetime)True. Và Timestamplớp học có to_datetime()phương pháp.
jfs

7
pd.to_datetime('2012-05-01T01:00:00.000000+0100')trả lại Timestamp('2012-05-01 00:00:00')ít nhất trong gấu trúc 0.17.1.
Anton Protopopov

96

Tôi nghĩ rằng có thể có một nỗ lực hợp nhất hơn trong câu trả lời để giải thích rõ hơn về mối quan hệ giữa mô-đun datetime của Python, datetime64 / timedelta64 và các đối tượng Timestamp / Timedelta của gấu trúc.

Thư viện chuẩn datetime của Python

Thư viện chuẩn datetime có bốn đối tượng chính

  • thời gian - chỉ thời gian, tính bằng giờ, phút, giây và micro giây
  • ngày - chỉ năm, tháng và ngày
  • datetime - Tất cả các thành phần của thời gian và ngày
  • timedelta - Một lượng thời gian với đơn vị ngày tối đa

Tạo bốn đối tượng này

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

Các đối tượng datetime64 và timedelta64 của NumPy

NumPy không có các đối tượng ngày và thời gian riêng biệt, chỉ có một đối tượng datetime64 để thể hiện một thời điểm duy nhất. Đối tượng datetime của mô đun datetime có độ chính xác micro giây (một phần triệu giây). Đối tượng datetime64 của NumPy cho phép bạn đặt độ chính xác của nó từ hàng giờ cho đến giây (10 ^ -18). Hàm tạo của nó linh hoạt hơn và có thể lấy nhiều loại đầu vào.

Xây dựng các đối tượng datetime64 và timedelta64 của NumPy

Truyền một số nguyên với một chuỗi cho các đơn vị. Xem tất cả các đơn vị ở đây . Nó được chuyển đổi thành nhiều đơn vị sau kỷ nguyên UNIX: ngày 1 tháng 1 năm 1970

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

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

Bạn cũng có thể sử dụng các chuỗi miễn là chúng ở định dạng ISO 8601.

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

Timedeltas có một đơn vị

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

Cũng có thể tạo chúng bằng cách trừ hai đối tượng datetime64

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

Pandas Timestamp và Timedelta xây dựng nhiều chức năng hơn trên NumPy

Một con gấu trúc Timestamp là một khoảnh khắc rất giống với thời gian nhưng có nhiều chức năng hơn. Bạn có thể xây dựng chúng bằng pd.Timestamphoặc 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 hoạt động rất giống nhau (với một vài tùy chọn khác) và có thể chuyển đổi danh sách các chuỗi thành Dấu thời gian.

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

Chuyển đổi datetime của Python thành datetime64 và Dấu thời gian

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

Chuyển đổi datetime64 numpy thành datetime và Dấu thời gian

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

Chuyển đổi sang Dấu thời gian

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

Chuyển đổi từ Dấu thời gian sang datetime và datetime64

Điều này khá dễ dàng vì dấu thời gian của gấu trúc rất mạnh

>>> 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
Thật điên rồ khi numpy đến datetime vẫn khó / hacky ... có thực sự không có cách nào tốt hơn? Đây là một câu trả lời hay, tôi đang suy nghĩ về việc chấp nhận chuyển nó lên cấp cao nhất tôi phải đọc những người khác sâu hơn một lần bằng máy tính.
Andy Hayden

Điều gì kỳ quặc về nó? Pandas Timestamp hoạt động tốt và khá đơn giản.
Ted Petrou

2
Numpy đến datetime.
Andy Hayden

1
Tôi nghĩ rằng đây là câu trả lời tốt nhất mà tôi từng thấy. Đến từ Excel, VBA, SAS hoặc SQL, Python có vẻ kỳ lạ vì không chỉ có "một cách" để làm việc với ngày / lần. Như với nhiều thứ trong Python hoặc R, có vẻ như người ta phải chọn một phương thức / mô-đun / lớp yêu thích và gắn bó với nó.
Sean McCarthy


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

Đối với DatetimeIndex, tolisttrả về một danh sách các datetimeđối tượng. Đối với một datetime64đối tượng duy nhất, nó trả về một datetimeđối tượng duy nhất .


Tôi thực sự nên thử tất cả các phương pháp :) (Tôi bị sốc khi biết tôi đã vật lộn với cái này bao lâu) Cảm ơn
Andy Hayden

5
@hayden nếu bạn biết rằng đó là một mảng vô hướng / 0-d, tôi muốn sử dụng .item()nó rõ ràng hơn nhiều (và không ai có thể đi xung quanh và bắt đầu tranh luận rằng nó sẽ trả về một danh sách).
seberg

1
Tôi e rằng điều này dường như không phải lúc nào cũng hoạt động: ví dụ: dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')điều này mang lại một thời gian dài ( 1025222400000000000L) (!)
Andy Hayden

4
@hayden: loại được trả về bởi .item()(được đề xuất bởi @seberg), .tolist()tùy thuộc vào đơn vị datetime64 sử dụng, ví dụ: Dsản xuất datetime.date(), us(micro giây) tạo ra datetime.datetime(), ns(nano giây) tạo ra long. Và các đơn vị thay đổi tùy thuộc vào giá trị đầu vào, ví dụ, numpy.datetime64('2012-05-01')sử dụng 'D', numpy.datetime64('2012-05-01T00:00:00.000')sử dụng ms, numpy.datetime64('2012-05-01T00:00:00.000000000')sử dụng ns. Bạn có thể mở một vấn đề nếu bạn thấy nó khó hiểu.
jfs

@AndyHayden Bạn cũng có thể chỉ cần thêm một đối số phụ, 'chúng tôi' hoặc 'ms' để đảm bảo định dạng tương tự được áp dụng dẫn đến cùng một yếu tố thời gian được tạo ra trong tolist ()
NM

11

Nếu bạn muốn chuyển đổi toàn bộ chuỗi datasimes của gấu trúc thành datetimes python thông thường, bạn cũng có thể sử dụng .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)
   ....

Nó cũng hỗ trợ múi giờ:

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

LƯU Ý : Nếu bạn đang vận hành trên Sê-ri Pandas, bạn không thể gọi to_pydatetime()trên toàn bộ sê-ri . Bạn sẽ cần phải gọi .to_pydatetime()trên từng datetime64 riêng lẻ bằng cách hiểu danh sách hoặc một cái gì đó tương tự:

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

10

Một tùy chọn là sử dụng str, và sau đó to_datetime(hoặc tương tự):

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

Lưu ý: nó không bằng dtvì nó trở thành "nhận biết bù đắp" :

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

Điều này có vẻ không phù hợp.

.

Cập nhật: điều này có thể đối phó với "ví dụ khó chịu":

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)

Cảm ơn Andy đã chia sẻ mẹo này. Vì một số lý do, tôi không thể làm cho nó hoạt động được, như tôi đã thảo luận ở đây: stackoverflow.com/questions/22825349/
Khăn

@ user815423426 đây chưa bao giờ là một giải pháp rất mạnh mẽ, tôi đoán bạn có thể truyền một định dạng cho hàm tạo datetime để hoạt động chung hơn. Không phải là rất lớn mặc dù!
Andy Hayden

8

Bài đăng này đã được 4 năm và tôi vẫn phải vật lộn với vấn đề chuyển đổi này - vì vậy vấn đề này vẫn còn hoạt động trong năm 2017 theo một số ý nghĩa. Tôi đã hơi sốc khi tài liệu numpy không sẵn sàng cung cấp một thuật toán chuyển đổi đơn giản nhưng đó là một câu chuyện khác.

Tôi đã tìm ra một cách khác để thực hiện chuyển đổi chỉ liên quan đến các mô-đun numpydatetime, nó không yêu cầu gấu trúc được nhập mà dường như tôi có rất nhiều mã để nhập cho một chuyển đổi đơn giản như vậy. Tôi nhận thấy rằng datetime64.astype(datetime.datetime)sẽ trả về một datetime.datetimeđối tượng nếu bản gốc datetime64đơn vị micro-giây trong khi các đơn vị khác trả về dấu thời gian nguyên. Tôi sử dụng mô-đun xarraycho I / O dữ liệu từ các tệp Netcdf sử dụng datetime64đơn vị tính bằng nano giây khiến việc chuyển đổi không thành công trừ khi bạn lần đầu tiên chuyển đổi sang đơn vị micro-giây. Dưới đây là mã chuyển đổi ví dụ,

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

Nó chỉ được thử nghiệm trên máy của tôi, đó là Python 3.6 với bản phân phối Anaconda 2017 gần đây. Tôi chỉ xem xét chuyển đổi vô hướng và chưa kiểm tra chuyển đổi dựa trên mảng mặc dù tôi đoán nó sẽ tốt. Tôi cũng chưa xem mã nguồn datetime64 numpy để xem liệu hoạt động có ý nghĩa hay không.


Điều đó thật tuyệt. Cảm ơn bạn đã làm điều này.
Yu Chen

Đồ tốt. Cảm ơn bạn.
misantroop

1

Tôi đã quay lại câu trả lời này nhiều lần hơn tôi có thể đếm được, vì vậy tôi quyết định kết hợp một lớp nhỏ nhanh chóng, chuyển đổi datetime64giá trị Numpy thành giá trị Python datetime. Tôi hy vọng nó sẽ giúp những người khác ngoài đó.

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)

Tôi sẽ giữ cái này trong túi dụng cụ của mình, một cái gì đó cho tôi biết tôi sẽ cần nó một lần nữa.


2
Bạn chỉ có thể làmts.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()

sử dụng hàm này để lấy đối tượng datetime gốc của pythons


Tôi có một lỗi nóireplace() got an unexpected keyword argument 'tzinfo'
ogogmad

Bạn sử dụng phiên bản gấu trúc nào? Tôi có Phiên bản: 0.18.1 (gấu trúc hiển thị gấu trúc)
Crystal

giống như bạn. . .
ogogmad

Tôi không biết sau đó nhưng nó làm việc cho tôi như sự quyến rũ. pix.toile-libre.org/upload/origen/1475645621.png
Pha lê

0

Một số giải pháp hoạt động tốt cho tôi nhưng numpy sẽ phản đối một số tham số. Giải pháp phù hợp hơn với tôi là đọc ngày tháng theo thời gian của gấu trúc và trích xuất rõ ràng năm, tháng và ngày của một đối tượng gấu trúc. Các mã sau đây hoạt động cho tình huống phổ biến nhất.

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

thật vậy, tất cả các loại thời gian này có thể khó khăn và có khả năng có vấn đề (phải theo dõi cẩn thận thông tin múi giờ). đây là những gì tôi đã làm, mặc dù tôi thừa nhận rằng tôi lo ngại rằng ít nhất một phần của nó là "không phải do thiết kế". Ngoài ra, điều này có thể được thực hiện nhỏ gọn hơn một chút khi cần thiết. bắt đầu với một numpy.datetime64 dt_a:

dt_a

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

dt_a1 = dt_a.tolist () # mang lại một đối tượng datetime trong UTC, nhưng không có tzinfo

dt_a1

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

# now, make your "aware" datetime:

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

... Và tất nhiên, điều đó có thể được nén thành một dòng khi cần thiết.


docs.scipy.org/doc/numpy/reference/ cho những thay đổi trong xử lý múi giờ.
hpaulj

Vui lòng edittuân thủ đúng: định dạng mã, định dạng trích dẫn và định dạng văn bản. Ngoài ra, vui lòng tuân thủ cách viết hoa, ngữ pháp và kiểm tra lỗi chính tả, theo hướng dẫn của SO - xem: Cách đăngMẫu mã
SherylHohman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.