Как мне преобразовать numpy.datetime64
объект в datetime.datetime
(или Timestamp
)?
В следующем коде я создаю объекты datetime, timestamp и 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')
Примечание: дату и время легко получить из метки времени:
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
) ...
numpy
,pandas
версий.pd.Timestamp(dt64).to_datetime()
. Я все еще немного недоволен этим, но, конечно, Уэс менее специфичен для моей старой проблемы (и тем лучше для мира)! Еще раз спасибо, что нашли время, чтобы ответить на него. :)Timestamp
» иTimestamp
являетсяdatetime
(подклассом) в любом случае :)Ответы:
Чтобы преобразовать
numpy.datetime64
в объект datetime, который представляет время в формате UTCnumpy-1.8
:В приведенном выше примере предполагается, что наивный объект datetime интерпретируется
np.datetime64
как время в формате UTC.Чтобы преобразовать datetime в np.datetime64 и обратно (
numpy-1.6
):Он работает как с одним объектом np.datetime64, так и с массивом np.datetime64.
Думайте о np.datetime64 так же, как о np.int8, np.int16 и т. Д., И применяйте те же методы для преобразования между объектами Python, такими как int, datetime и соответствующие объекты numpy.
Ваш "неприятный пример" работает правильно:
Я могу воспроизвести
long
значение наnumpy-1.8.0
установленном как:Тот же пример:
Это возвращает,
long
потому что дляnumpy.datetime64
типа.astype(datetime)
эквивалентно тому,.astype(object)
что возвращает Python integer (long
) наnumpy-1.8
.Чтобы получить объект datetime, вы можете:
Чтобы получить datetime64, который напрямую использует секунды:
Документы NumPy говорят, что API datetime является экспериментальным и может измениться в будущих версиях NumPy.
источник
dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
, что дает длинный (1025222400000000000L
) (!)type(dt64)
.dt64.astype(datetime) == datetime.utcfromtimestamp(dt64.astype(int)*1e-6)
type(dt64)
- этоnumpy.datetime64
иdt64.astype(datetime)
есть тот же длинный int ...: snumpy.__version__
->'1.6.1'
Вы можете просто использовать конструктор pd.Timestamp. Следующая диаграмма может быть полезна для этого и связанных вопросов.
источник
pd.to_datetime
преобразует все вpd.Timestamp
. Уpd.Timestamp
объекта есть методto_pydatetime
для возврата обратно кdatetime.datetime
объекту иto_datetime64
метод для преобразованияnp.datetime64
.Добро пожаловать в ад.
Вы можете просто передать объект datetime64
pandas.Timestamp
:Я заметил, что это не работает правильно, хотя в NumPy 1.6.1:
Также,
pandas.to_datetime
может быть использовано (это не из версии dev, еще не проверял v0.9.1):источник
issubclass(pd.Timestamp, datetime)
этоTrue
. И уTimestamp
самого класса естьto_datetime()
метод.pd.to_datetime('2012-05-01T01:00:00.000000+0100')
возвращаетсяTimestamp('2012-05-01 00:00:00')
хотя бы в пандах0.17.1
.Я думаю, что ответ может быть более консолидированным, чтобы лучше объяснить взаимосвязь между модулем datetime в Python, datetime64 / timedelta64 от numpy и объектами Timestamp / Timedelta от pandas.
Стандартная библиотека даты и времени Python
Стандартная библиотека datetime имеет четыре основных объекта
Создайте эти четыре объекта
Объекты datetime64 и timedelta64 в NumPy
NumPy не имеет отдельных объектов даты и времени, только один объект datetime64, представляющий один момент времени. Объект datetime модуля datetime имеет микросекундную точность (одна миллионная доли секунды). Объект datetime64 в NumPy позволяет вам устанавливать его точность от часов до аттосекунд (10 ^ -18). Его конструктор более гибкий и может принимать различные входные данные.
Создайте объекты datetime64 и timedelta64 в NumPy
Передайте целое число со строкой для единиц. Посмотреть все единицы здесь . Он преобразован в такое количество единиц после эпохи UNIX: 1 января 1970 г.
Вы также можете использовать строки, если они в формате ISO 8601.
Timedeltas имеют одну единицу
Можно также создать их, вычитая два объекта datetime64
Pandas Timestamp и Timedelta создают гораздо больше функциональности поверх NumPy
Отметка времени панды - это момент времени, очень похожий на дату, но с гораздо большей функциональностью. Вы можете построить их либо
pd.Timestamp
илиpd.to_datetime
.pd.to_datetime
работает очень похоже (с несколькими дополнительными опциями) и может конвертировать список строк в метки времени.Преобразование Python datetime в datetime64 и Timestamp
Преобразование numpy datetime64 в datetime и Timestamp
Преобразовать в метку времени
Конвертировать из Timestamp в datetime и datetime64
Это довольно просто, поскольку метки времени для панд очень мощные
источник
For
DatetimeIndex
,tolist
возвращает списокdatetime
объектов. Для одногоdatetime64
объекта он возвращает одинdatetime
объект.источник
.item()
который гораздо более явный (и никто не может прийти в себя и начать утверждать, что он должен возвращать список).dt64 = numpy.datetime64('2002-06-28T01:00:00.000000000+0100')
, что дает длинный (1025222400000000000L
) (!).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
. Вы можете открыть вопрос, если сочтете это непонятным.Если вы хотите преобразовать целую серию дат и времени панд в обычные даты-питоны, вы также можете использовать
.to_pydatetime()
.Он также поддерживает часовые пояса:
ПРИМЕЧАНИЕ . Если вы работаете с серией Pandas, вы не можете
to_pydatetime()
использовать всю серию. Вам нужно будет вызывать.to_pydatetime()
каждую отдельную дату / время64, используя понимание списка или что-то подобное:источник
Одним из вариантов является использование
str
, а затемto_datetime
(или аналог):Примечание: это не равно,
dt
потому что это становится "осведомленным о смещении" :Это кажется не элегантным.
,
Обновление: это может иметь дело с «неприятным примером»:
источник
Эта статья была опубликована в течение 4 лет, и я все еще боролся с этой проблемой преобразования, так что эта проблема все еще остается активной в 2017 году. Я был несколько шокирован тем, что в простой документации нет простого алгоритма преобразования, но это уже другая история.
Я нашел другой способ сделать преобразование, которое включает только модули
numpy
иdatetime
не требует импорта панд, что мне кажется большим количеством кода для импорта для такого простого преобразования. Я заметил, чтоdatetime64.astype(datetime.datetime)
вернетdatetime.datetime
объект, если оригиналdatetime64
в микросекундах, в то время как другие единицы возвращают целочисленную метку времени. Я использую модульxarray
для ввода / вывода данных из файлов Netcdf, который используетdatetime64
единицы измерения в наносекундах, что делает преобразование неудачным, если вы сначала не конвертируете в микросекунды . Вот пример кода преобразования,Его тестировали только на моей машине, это Python 3.6 с дистрибутивом Anaconda 2017 года. Я только посмотрел на скалярное преобразование и не проверял преобразования на основе массива, хотя я предполагаю, что это будет хорошо. Также я не посмотрел на обалденный исходный код datetime64, чтобы понять, имеет ли эта операция смысл или нет.
источник
Я возвращался к этому ответу больше раз, чем могу сосчитать, поэтому я решил собрать небольшой быстрый класс, который преобразует
datetime64
значение Numpy в значение Pythondatetime
. Я надеюсь, что это помогает другим там.Я оставлю это в моей сумке с инструментами, что-то подсказывает мне, что она мне понадобится снова.
источник
ts.to_pydatetime()
используйте эту функцию, чтобы получить родной объект даты и времени питонов
источник
replace() got an unexpected keyword argument 'tzinfo'
Некоторые решения работают хорошо для меня, но numpy не поддерживает некоторые параметры. Решение, которое работает лучше для меня, состоит в том, чтобы прочитать дату как дату-время панды и явно исключить год, месяц и день объекта панды. Следующий код работает для наиболее распространенной ситуации.
источник
действительно, все эти типы даты и времени могут быть трудными и потенциально проблематичными (необходимо тщательно отслеживать информацию о часовых поясах). вот что я сделал, хотя я признаю, что обеспокоен тем, что, по крайней мере, часть этого «не задумана». Кроме того, это может быть сделано немного более компактным по мере необходимости. начиная с numpy.datetime64 dt_a:
numpy.datetime64 ( '2015-04-24T23: 11: 26.270000-0700')
datetime.datetime (2015, 4, 25, 6, 11, 26, 270000)
... и, конечно, это может быть сжато в одну строку по мере необходимости.
источник
edit
соблюдайте правильность: форматирование кода, форматирование цитаты и форматирование текста. Кроме того, соблюдайте правильную