Преобразование cftime.DatetimeJulian в datetime

#python #pandas #python-xarray

#python #панды #python-xarray

Вопрос:

Я пытаюсь преобразовать массив xarray данных в фрейм данных pandas для проекта машинного обучения, но данные о времени отображаются в cftime.DatetimeJulian формате, который нельзя преобразовать с помощью метода pandas to_datetime() . Предложения? Спасибо.

 nor_xr.time

<xarray.DataArray 'time' (time: 1372)>
array([cftime.DatetimeJulian(2015, 3, 31, 0, 0, 0, 0, 0, 90),
       cftime.DatetimeJulian(2018, 12, 31, 0, 0, 0, 0, 6, 365)], dtype=object)
Coordinates:
  * time     (time) object 2015-03-31 00:00:00 ... 2018-12-31 00:00:00
Attributes:
    standard_name:  time
    axis:           T

nor_df = nor_xr.to_dataframe().reset_index()
nor_df.head()

    time
0   2015-03-31 00:00:00
1   2015-04-01 00:00:00

pd.to_datetime(nor_df.time)

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-104-1f0fc00ad825> in <module>
      2 
      3 #|nor_df.time.unique()
----> 4 pd.to_datetime(nor_df.time)

~AppDataLocalContinuumanaconda3Alibsite-packagespandascoretoolsdatetimes.py in to_datetime(arg, errors, dayfirst, yearfirst, utc, box, format, exact, unit, infer_datetime_format, origin, cache)
    449         else:
    450             from pandas import Series
--> 451             values = _convert_listlike(arg._values, True, format)
    452             result = Series(values, index=arg.index, name=arg.name)
    453     elif isinstance(arg, (ABCDataFrame, MutableMapping)):

~AppDataLocalContinuumanaconda3Alibsite-packagespandascoretoolsdatetimes.py in _convert_listlike(arg, box, format, name, tz)
    366                     dayfirst=dayfirst,
    367                     yearfirst=yearfirst,
--> 368                     require_iso8601=require_iso8601
    369                 )
    370 

pandas_libstslib.pyx in pandas._libs.tslib.array_to_datetime()

pandas_libstslib.pyx in pandas._libs.tslib.array_to_datetime()

pandas_libstslib.pyx in pandas._libs.tslib.array_to_datetime()

TypeError: <class 'cftime._cftime.DatetimeJulian'> is not convertible to datetime
  

Ответ №1:

Действительно, это обычный запрос. Рекомендуемый способ сделать это — извлечь индекс (a CFTimeIndex ) и использовать его встроенный to_datetimeindex метод:

 datetimeindex = nor_xr.indexes['time'].to_datetimeindex()
  

Затем вы можете CFTimeIndex заменить его DatetimeIndex аналогом:

 nor_xr['time'] = datetimeindex
  

Комментарии:

1. Подтверждение того, что это решение работает для аналогичной проблемы с cftime. DatetimeNoLeap также.

Ответ №2:

Я нашел простой способ конвертировать из cftime.DatetimeNoLeap в объект datetime. Скажем, например, datetimes — это список cftime.Объекты DatetimeNoLeap с datetimes[0] = cftime.DatetimeNoLeap(1970, 1, 1, 12, 0, 0, 0, has_year_zero=Истина)

 datetime.strptime(str(datetimes[0]),'%Y-%m-%d %H:%M:%S')
  

Это даст вам datetime.datetime(1970, 1, 1, 12, 0).

Ответ №3:

Простое и понятное решение с использованием формата iso

 from datetime import datetime

datetime(cfdatetime.isoformat())