给定形状(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]')
但是由于列表补偿这个速度很慢 - 它并不像我想的那样完全矢量化。我想知道是否有更好的方法来获取多对日期的日期范围?
我会根据需要提供尽可能多的澄清。感谢。
答案 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
空间d
,timedelta
空间也在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;
}