我正在尝试为一个机器学习项目将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)
~\AppData\Local\Continuum\anaconda3A\lib\site-packages\pandas\core\tools\datetimes.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)):
~\AppData\Local\Continuum\anaconda3A\lib\site-packages\pandas\core\tools\datetimes.py in _convert_listlike(arg, box, format, name, tz)
366 dayfirst=dayfirst,
367 yearfirst=yearfirst,
--> 368 require_iso8601=require_iso8601
369 )
370
pandas\_libs\tslib.pyx in pandas._libs.tslib.array_to_datetime()
pandas\_libs\tslib.pyx in pandas._libs.tslib.array_to_datetime()
pandas\_libs\tslib.pyx in pandas._libs.tslib.array_to_datetime()
TypeError: <class 'cftime._cftime.DatetimeJulian'> is not convertible to datetime
发布于 2019-04-22 08:22:04
事实上,这是一个常见的请求。推荐的方法是提取索引(一个CFTimeIndex
)并使用其内置的to_datetimeindex
方法:
datetimeindex = nor_xr.indexes['time'].to_datetimeindex()
然后,您可以用其对应的DatetimeIndex
替换CFTimeIndex
:
nor_xr['time'] = datetimeindex
发布于 2021-10-26 19:04:27
我找到了一种从cftime.DatetimeNoLeap转换为datetime对象的简单方法。例如datetimes是一个cftime.DatetimeNoLeap对象列表,其中datetimes = cftime.DatetimeNoLeap(1970,1,1,12,0,0,0,0,has_year_zero=True)
datetime.strptime(str(datetimes[0]),'%Y-%m-%d %H:%M:%S')
这将得到datetime.datetime(1970,1,1,12,0)。
https://stackoverflow.com/questions/55786995
复制相似问题