如何按日期过滤numpy.ndarray?

9 投票
2 回答
9436 浏览
提问于 2025-04-16 03:26

我有一个二维的numpy数组,第一列是日期时间对象,第二列是整数:

A = array([[2002-03-14 19:57:38, 197],
       [2002-03-17 16:31:33, 237],
       [2002-03-17 16:47:18, 238],
       [2002-03-17 18:29:31, 239],
       [2002-03-17 20:10:11, 240],
       [2002-03-18 16:18:08, 252],
       [2002-03-23 23:44:38, 327],
       [2002-03-24 09:52:26, 334],
       [2002-03-25 16:04:21, 352],
       [2002-03-25 18:53:48, 353]], dtype=object)

我想做的是选择某个特定日期的所有行,类似于

A[first_column.date()==datetime.date(2002,3,17)]
array([[2002-03-17 16:31:33, 237],
           [2002-03-17 16:47:18, 238],
           [2002-03-17 18:29:31, 239],
           [2002-03-17 20:10:11, 240]], dtype=object)

我该怎么做呢?

谢谢你的帮助 :)

2 个回答

2
from datetime import datetime as dt, timedelta as td
import numpy as np

# Create 2-d numpy array
d1 = dt.now()
d2 = dt.now()
d3 = dt.now() - td(1)
d4 = dt.now() - td(1)
d5 = d1 + td(1)
arr = np.array([[d1, 1], [d2, 2], [d3, 3], [d4, 4], [d5, 5]])

# Here we will extract all the data for today, so get date range in datetime
dtx = d1.replace(hour=0, minute=0, second=0, microsecond=0)
dty = dtx + td(hours=24)

# Condition 
cond = np.logical_and(arr[:, 0] >= dtx, arr[:, 0] < dty)

# Full array
print arr
# Extracted array for the range
print arr[cond, :]

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

8

你可以这样做:

from_date=datetime.datetime(2002,3,17,0,0,0)
to_date=from_date+datetime.timedelta(days=1)
idx=(A[:,0]>from_date) & (A[:,0]<=to_date)
print(A[idx])
# array([[2002-03-17 16:31:33, 237],
#        [2002-03-17 16:47:18, 238],
#        [2002-03-17 18:29:31, 239],
#        [2002-03-17 20:10:11, 240]], dtype=object)

A[:,0]A 的第一列。

不过,把 A[:,0] 和一个 datetime.date 对象进行比较会出现类型错误(TypeError)。但是,和 datetime.datetime 对象比较就没问题:

In [63]: A[:,0]>datetime.datetime(2002,3,17,0,0,0)
Out[63]: array([False,  True,  True,  True,  True,  True,  True,  True,  True,  True], dtype=bool)

可惜的是,

datetime.datetime(2002,3,17,0,0,0)<A[:,0]<=datetime.datetime(2002,3,18,0,0,0)

也会出现类型错误,因为这会调用 datetime.datetime__lt__ 方法,而不是 numpy 数组的 __lt__ 方法。可能这是个bug。

不过,这并不难解决;你可以这样写:

In [69]: (A[:,0]>datetime.datetime(2002,3,17,0,0,0)) & (A[:,0]<=datetime.datetime(2002,3,18,0,0,0))
Out[69]: array([False,  True,  True,  True,  True, False, False, False, False, False], dtype=bool)

因为这会给你一个布尔数组,所以你可以把它当作“花式索引”来用在 A 上,这样就能得到想要的结果。

撰写回答