首页 > 解决方案 > 将 df.index dtype='datetime64[ns]' 数组转换为 Date

问题描述

我用pd.Grouper3 天的频率对时间序列进行分组。要检索时间数组,我使用date = df.index.values它返回一个时间数组,如下所示:

array(['2010-01-31T00:00:00.000000000', '2010-02-03T00:00:00.000000000',
   '2017-05-12T00:00:00.000000000', '2017-05-15T00:00:00.000000000',
   '2017-05-18T00:00:00.000000000', '2017-05-21T00:00:00.000000000',
   '2017-05-24T00:00:00.000000000', '2017-05-27T00:00:00.000000000',
   '2017-05-30T00:00:00.000000000', '2017-06-02T00:00:00.000000000',
   '2017-06-05T00:00:00.000000000', '2017-06-08T00:00:00.000000000',
   '2017-06-11T00:00:00.000000000', '2017-06-14T00:00:00.000000000',
   '2017-06-17T00:00:00.000000000', '2017-06-20T00:00:00.000000000',
   '2017-06-23T00:00:00.000000000', '2017-06-26T00:00:00.000000000',
   '2017-06-29T00:00:00.000000000', '2017-07-02T00:00:00.000000000',
   '2017-07-05T00:00:00.000000000', '2017-07-08T00:00:00.000000000',
   '2017-07-11T00:00:00.000000000', '2017-07-14T00:00:00.000000000',
   '2017-07-17T00:00:00.000000000', '2017-07-20T00:00:00.000000000',
   '2017-07-23T00:00:00.000000000', '2017-07-26T00:00:00.000000000',
   '2017-07-29T00:00:00.000000000', '2017-08-01T00:00:00.000000000',
   '2017-08-04T00:00:00.000000000', '2017-08-07T00:00:00.000000000'],
  dtype='datetime64[ns]')

我一直在努力争取约会(最终摆脱 MJD)。当我复制该数组的 1-2 个元素并执行此操作时,它会起作用;

times =['2010-02-03T00:00:00.000000000','2010-02-03T00:00:00.000000000']
t = Time(times, format='isot', scale='utc') 
print(t.mjd)
>>[55230. 55230.]

但是,我无法对整个数组使用相同类型的代码

from astropy.time import Time
t = Time(date, format='isot', scale='utc') 
print(t.mjd)

它给了我一个错误“输入值与格式类 isot 不匹配”。所以,我猜想 Time 需要列表而不是数组,但是将 Date 更改为 list 并不能解决问题。我无法解决,上面的示例是 2 个字符串的列表,它工作正常。我在这里做错了什么?我尝试了其他几种使用 pandas 并尝试循环元素的方法。谢谢您的帮助。阿比

标签: pythonpandasastropy

解决方案


由于 astropy 3.1 内置了对 的支持datetime64,所以你可以简单地这样做:

In [2]: dates = np.array(['2010-01-31T00:00:00', '2010-02-03T00:00:00'],
   ...:   dtype='datetime64[ns]')
   ...:   

In [3]: tm = Time(dates)

In [4]: tm.mjd
Out[4]: array([55227., 55230.])

推荐阅读