1

我正在使用 matplotlib.dates 将我的字符串日期转换为日期对象,认为以后操作会更容易。

import matplotlib.dates as md    
def ConvertDate(datestr):
    '''
    Convert string date into matplotlib date object
    '''
    datefloat = md.datestr2num(datestr)
    return md.num2date(datefloat)

我试图做的是过滤我的结构化数组以告诉我行的索引号属于某个月份和/或年份

import numpy as np
np.where( data['date'] == 2008 )

我可能可以使用 lambda 函数将每个对象转换为字符串值,就像这样

lambda x: x.strftime('%Y')

比较每个项目,但我不知道在哪里将这个 lambda 函数放入 np.where 或者它是否可能。

有任何想法吗?还是有更好的方法来做到这一点?

4

2 回答 2

1

注意:您不妨使用 datetime 的datetime.strptime功能:

import datetime
import numpy as np
dt1 = datetime.datetime.strptime('1/2/2012', '%d/%m/%Y')
dt2 = datetime.datetime.strptime('1/2/2011', '%d/%m/%Y')

In [5]: dt1
Out[5]: datetime.datetime(2012, 2, 1, 0, 0)

然后,您可以使用numpy.non-zero(将您的数组过滤到那些日期时间的索引,例如,年份是 2012 年):

a = np.array([dt1, dt2])
b = np.array(map(lambda x: x.year, a))

In [8]: b
Out[8]: array([2012, 2011], dtype=bool)

In [9]: np.nonzero(b==2012)
Out[9]: (array([0]),)

另外,我建议研究具有内置此功能(在 numpy 之上)、更多便利功能(例如)以及高效日期时间存储的to_datetime

于 2012-12-17T11:03:36.540 回答
1

在收到很多错误消息之后,我想我找到了自己问题的答案。

[ x for x in range(len(data)) if data['date'][x].year == 2008 ]

我做了一个列表理解来返回与查询匹配的结构化数组的索引。我还加入了@hayden 的建议,使用它.year而不是strftime()Maybenumpy.where()仍然更快,但这符合我现在的需求。

于 2012-12-17T11:28:39.890 回答