给定一个形状为 (n, 2)
的日期时间数组:
x = np.array([['2017-10-02T00:00:00.000000000', '2017-10-12T00:00:00.000000000']], dtype='datetime64[ns]')
x
的形状为 (1, 2)
,但实际上它可能是 (n, 2)
, n > = 1
。在每对中,第一个日期始终小于(或等于)第二个日期。我想获取 x
中每对日期之间的所有日期范围的列表。这基本上就是我正在做的事情:
np.concatenate([pd.date_range(*y, closed='right') for y in x])
它有效,给予
array(['2017-10-03T00:00:00.000000000', '2017-10-04T00:00:00.000000000',
'2017-10-05T00:00:00.000000000', '2017-10-06T00:00:00.000000000',
'2017-10-07T00:00:00.000000000', '2017-10-08T00:00:00.000000000',
'2017-10-09T00:00:00.000000000', '2017-10-10T00:00:00.000000000',
'2017-10-11T00:00:00.000000000', '2017-10-12T00:00:00.000000000'], dtype='datetime64[ns]')
但是由于列表比较,这非常慢 - 它没有按照我想要的那样完全矢量化。我想知道是否有更好的方法来获取多对日期的日期范围?
我将根据需要提供尽可能多的说明。谢谢。
最佳答案
有点复杂……
但是
d = np.array(1, dtype='timedelta64[D]')
x = x.astype('datetime64[D]')
deltas = np.diff(x, axis=1) / d
np.concatenate([
i + np.arange(j + 1) for i, j in zip(x[:, 0], deltas[:, 0].astype(int))
]).astype('datetime64[ns]')
array(['2017-10-02T00:00:00.000000000', '2017-10-03T00:00:00.000000000',
'2017-10-04T00:00:00.000000000', '2017-10-05T00:00:00.000000000',
'2017-10-06T00:00:00.000000000', '2017-10-07T00:00:00.000000000',
'2017-10-08T00:00:00.000000000', '2017-10-09T00:00:00.000000000',
'2017-10-10T00:00:00.000000000', '2017-10-11T00:00:00.000000000',
'2017-10-12T00:00:00.000000000'], dtype='datetime64[ns]')
工作原理
d
代表一天x
转换为没有时间戳的日期diff
获取天数差异...但在timedelta
空间- 我除以我的
d
,它也在timedelta
空间中,尺寸消失了......留下我的float
,我将其转换为int
- 当我将
x[:, 0]
对的第一列添加到整数数组中时,我会收到添加 1 个单位的广播,无论x< 的维度是什么
,即datetime64[D]
。所以我要添加一天。
源自/受@hpaulj启发
如果他们发布答案就会删除
d = np.array(1, dtype='timedelta64[D]')
np.concatenate([np.arange(row[0], row[1] + 1, d) for row in x])
array(['2017-10-02T00:00:00.000000000', '2017-10-03T00:00:00.000000000',
'2017-10-04T00:00:00.000000000', '2017-10-05T00:00:00.000000000',
'2017-10-06T00:00:00.000000000', '2017-10-07T00:00:00.000000000',
'2017-10-08T00:00:00.000000000', '2017-10-09T00:00:00.000000000',
'2017-10-10T00:00:00.000000000', '2017-10-11T00:00:00.000000000',
'2017-10-12T00:00:00.000000000'], dtype='datetime64[ns]')
关于python - 获取多个日期时间对的日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46968623/