python - 获取多个日期时间对的日期范围

标签 python performance pandas numpy datetime

给定一个形状为 (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/

相关文章:

python - 带有请求的 flask 损坏的管道

python - Python 在字符串中搜索时何时引发 UnicodeDecodeError

python - 使用 tweepy 导入错误

c++ - 为什么使用指针会降低性能

javascript - JS eval 非常慢需要更好的方法

python - 重载按位运算符以在 Python 中使用 bool 值

performance - 忽略lua中代码的最有效方法是什么?

python - 将时间序列转换为数据帧,使得每一行都有连续的时间片

python - 数据透视表中的条形图,包含总计和每组聚合的百分比

Python循环检查列中的行是否为空然后替换