熊猫的滑动窗口日期愤怒

时间:2019-09-09 11:23:05

标签: python pandas datetime

Pandas date_range函数使我们可以按一定频率制作滚动窗口。

pd.date_range(start='2019-06-01', end='2019-07-01', freq='3D')

# Output
DatetimeIndex(['2019-06-01', '2019-06-04', '2019-06-07', '2019-06-10',
               '2019-06-13', '2019-06-16', '2019-06-19', '2019-06-22',
               '2019-06-25', '2019-06-28', '2019-07-01'],
              dtype='datetime64[ns]', freq='3D')

但是我想创建一个3天的滑动窗口。

[('2019-06-01', '2019-06-03'), ('2019-06-02', '2019-06-04'), ('2019-06-03', '2019-06-05'), ...]

我可以用熊猫吗?还是我应该写一个循环来获取日期?

2 个答案:

答案 0 :(得分:0)

循环解决方案:

#change range do default days
r = pd.date_range(start='2019-06-01', end='2019-07-01')

#create tuples in list comprehension
L = [(d.strftime('%Y-%m-%d'), (d + pd.Timedelta(2, 'd')).strftime('%Y-%m-%d')) for d in r]
print (L)
[('2019-06-01', '2019-06-03'), ('2019-06-02', '2019-06-04'), ('2019-06-03', '2019-06-05'), 
 ('2019-06-04', '2019-06-06'), ('2019-06-05', '2019-06-07'), ('2019-06-06', '2019-06-08'), 
 ('2019-06-07', '2019-06-09'), ('2019-06-08', '2019-06-10'), ('2019-06-09', '2019-06-11'), 
 ('2019-06-10', '2019-06-12'), ('2019-06-11', '2019-06-13'), ('2019-06-12', '2019-06-14'), 
 ('2019-06-13', '2019-06-15'), ('2019-06-14', '2019-06-16'), ('2019-06-15', '2019-06-17'), 
 ('2019-06-16', '2019-06-18'), ('2019-06-17', '2019-06-19'), ('2019-06-18', '2019-06-20'), 
 ('2019-06-19', '2019-06-21'), ('2019-06-20', '2019-06-22'), ('2019-06-21', '2019-06-23'), 
 ('2019-06-22', '2019-06-24'), ('2019-06-23', '2019-06-25'), ('2019-06-24', '2019-06-26'), 
 ('2019-06-25', '2019-06-27'), ('2019-06-26', '2019-06-28'), ('2019-06-27', '2019-06-29'), 
 ('2019-06-28', '2019-06-30'), ('2019-06-29', '2019-07-01'), ('2019-06-30', '2019-07-02'), 
 ('2019-07-01', '2019-07-03')]

Strides解决方案:

r = pd.date_range(start='2019-06-01', end='2019-07-01').strftime('%Y-%m-%d').values

def rolling_window(a, window):
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
    strides = a.strides + (a.strides[-1],)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
L1 = list(map(tuple, rolling_window(r, 3)[:, [0, -1]].tolist()))

答案 1 :(得分:0)

datetimeindex转换为s系列,并在listzip上使用ss.shift(-2)

s = pd.date_range(start='2019-06-01', end='2019-07-01', freq='D').to_series()
list(zip(s.dt.strftime('%Y-%m-%d'), s.shift(-2).dropna().dt.strftime('%Y-%m-%d')))

Out[678]:
[('2019-06-01', '2019-06-03'),
 ('2019-06-02', '2019-06-04'),
 ('2019-06-03', '2019-06-05'),
 ('2019-06-04', '2019-06-06'),
 ('2019-06-05', '2019-06-07'),
 ('2019-06-06', '2019-06-08'),
 ('2019-06-07', '2019-06-09'),
 ('2019-06-08', '2019-06-10'),
 ('2019-06-09', '2019-06-11'),
 ('2019-06-10', '2019-06-12'),
 ('2019-06-11', '2019-06-13'),
 ('2019-06-12', '2019-06-14'),
 ('2019-06-13', '2019-06-15'),
 ('2019-06-14', '2019-06-16'),
 ('2019-06-15', '2019-06-17'),
 ('2019-06-16', '2019-06-18'),
 ('2019-06-17', '2019-06-19'),
 ('2019-06-18', '2019-06-20'),
 ('2019-06-19', '2019-06-21'),
 ('2019-06-20', '2019-06-22'),
 ('2019-06-21', '2019-06-23'),
 ('2019-06-22', '2019-06-24'),
 ('2019-06-23', '2019-06-25'),
 ('2019-06-24', '2019-06-26'),
 ('2019-06-25', '2019-06-27'),
 ('2019-06-26', '2019-06-28'),
 ('2019-06-27', '2019-06-29'),
 ('2019-06-28', '2019-06-30'),
 ('2019-06-29', '2019-07-01')]