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

时间:2017-10-27 06:18:11

标签: 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]')

但是由于列表补偿这个速度很慢 - 它并不像我想的那样完全矢量化。我想知道是否有更好的方法来获取多对日期的日期范围?

我会根据需要提供尽可能多的澄清。感谢。

1 个答案:

答案 0 :(得分:2)

这有点令人费解...... 但

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空间
  • 我除以我的dtimedelta空间也在float空间,尺寸消失了......我留下了int,我投向x[:, 0]
  • 当我将对x的第一列添加到整数数组时,我得到一个广播,即添加1个单位的任何维度datetime64[D],即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]') 。所以我要加一天。

源于/启发@hpaulj
如果他们发布答案将删除

using WMPLib;

public Double getDuration(String path)
{
    WindowsMediaPlayer wmp = new WindowsMediaPlayerClass();
    IWMPMedia mediaInfo = wmp.newMedia(file);
    return mediaInfo.duration;
}