2017-01-07 62 views
1

我有一个DateTimeIndex如下所示:您可以看到时间戳均匀间隔,除了在从'2005-03-11 15:00:00'跳至'2005-03-13 17:30:00'跳跃的中间。Python熊猫:分裂DateTimeIndex在两个在缺少的时间戳

我该如何在缺少时间戳的地方以编程方式分割DateTimeIndex并返回2个DateTimeIndexs?

DateTimeIndex(['2005-03-11 11:00:00', '2005-03-11 11:30:00', 
       '2005-03-11 12:00:00', '2005-03-11 12:30:00', 
       '2005-03-11 13:00:00', '2005-03-11 13:30:00', 
       '2005-03-11 14:00:00', '2005-03-11 14:30:00', 
       '2005-03-11 15:00:00', '2005-03-13 17:00:00', 
       '2005-03-13 17:30:00', '2005-03-13 18:00:00', 
       '2005-03-13 18:30:00', '2005-03-13 19:00:00', 
       '2005-03-13 19:30:00', '2005-03-13 20:00:00', 
       '2005-03-13 20:30:00', '2005-03-13 21:00:00', 
       '2005-03-13 21:30:00', '2005-03-13 22:00:00', 
       '2005-03-13 22:30:00', '2005-03-13 23:00:00', 
       '2005-03-13 23:30:00', '2005-03-14 00:00:00')] 

回答

1

您可以使用diff找到一个序列缺失的元素,然后用numpy.split在缺少的元素分裂:

# get the time difference between each timestamp 
time_diffs = data.to_series().diff() 

# split at each break in the time data 
new_data = np.split(data, np.where(time_diffs > np.median(time_diffs))) 

编辑:使用显式循环而不是numpy.split和使用numpy.diff而不是pandas.series.diff的较早答案:

time_diffs = np.diff(data) 
new_data = [] 
start_idx = 0 

# loop once for each break in the data 
for idx in np.where(time_diffs > np.median(time_diffs)): 

    # build a new piece at each break in the data 
    new_data.append(data[start_idx:idx+1]) 
    start_idx = idx+1 

# add the last piece to the list 
new_data.append(data[start_idx:]) 

以上可以使用这一数据来运行:

import numpy as np 
import pandas as pd 

data = pd.DatetimeIndex([ 
    '2005-03-11 11:00:00', '2005-03-11 11:30:00', 
    '2005-03-11 12:00:00', '2005-03-11 12:30:00', 
    '2005-03-11 13:00:00', '2005-03-11 13:30:00', 
    '2005-03-11 14:00:00', '2005-03-11 14:30:00', 
    '2005-03-11 15:00:00', '2005-03-13 17:00:00', 
    '2005-03-13 17:30:00', '2005-03-13 18:00:00', 
    '2005-03-13 18:30:00', '2005-03-13 19:00:00', 
    '2005-03-13 19:30:00', '2005-03-13 20:00:00', 
    '2005-03-13 20:30:00', '2005-03-13 21:00:00', 
    '2005-03-13 21:30:00', '2005-03-13 22:00:00', 
    '2005-03-13 22:30:00', '2005-03-13 23:00:00', 
    '2005-03-13 23:30:00', '2005-03-14 00:00:00' 
]) 
+0

我喜欢这个解决方案,这就是我所追求的。但是,当尝试使用它时,我收到错误“未能强制类型numpy.ndarray的切片条目为整数”。任何想法可能是什么? –

+0

发现它:我不得不将np.where(time_diffs> np.median(time_diffs))中idx的行改为np.where中的idx(time_diffs> np.median(time_diffs))[0]' 。非常感谢,非常丰富! –

+0

'np.where(time_diffs> np.median(time_diffs))'由于某些原因在一个元组中出现的结果 –

0
DateTimeIndex1='' 
DateTimeIndex2='' 
for i in DateTimeIndex: 
if '30:00' in i[0]: 
    DateTimeIndex1+=i[0] 
else: 
    DateTimeIndex2+=i[0] 

尝试上面的代码,希望它可以帮助

1

这应该工作。你也有一些语法错误。

times = pd.DatetimeIndex(['2005-03-11 11:00:00', '2005-03-11 11:30:00', 
      '2005-03-11 12:00:00', '2005-03-11 12:30:00', 
      '2005-03-11 13:00:00', '2005-03-11 13:30:00', 
      '2005-03-11 14:00:00', '2005-03-11 14:30:00', 
      '2005-03-11 15:00:00', '2005-03-13 17:00:00', 
      '2005-03-13 17:30:00', '2005-03-13 18:00:00', 
      '2005-03-13 18:30:00', '2005-03-13 19:00:00', 
      '2005-03-13 19:30:00', '2005-03-13 20:00:00', 
      '2005-03-13 20:30:00', '2005-03-13 21:00:00', 
      '2005-03-13 21:30:00', '2005-03-13 22:00:00', 
      '2005-03-13 22:30:00', '2005-03-13 23:00:00', 
      '2005-03-13 23:30:00', '2005-03-14 00:00:00']) 

early = pd.DatetimeIndex(times[:9]) 
late = pd.DatetimeIndex(times[9:]) 

如果你试图分裂一个数据帧,请尝试:

time_split = '2005-03-11 15:00:00' 
early = df.ix[:time_split].index 
late = df.ix[time_split:].index 
1

我假设的差异,直到我们平分点是一致的。

split = tidx.to_series().diff().diff().abs().idxmax() 

t1 = tidx[tidx < split] 
t2 = tidx[tidx >= split] 

print(split) 

2005-03-13 17:00:00 

print(t1) 

DatetimeIndex(['2005-03-11 11:00:00', '2005-03-11 11:30:00', 
       '2005-03-11 12:00:00', '2005-03-11 12:30:00', 
       '2005-03-11 13:00:00', '2005-03-11 13:30:00', 
       '2005-03-11 14:00:00', '2005-03-11 14:30:00', 
       '2005-03-11 15:00:00'], 
       dtype='datetime64[ns]', freq=None) 

print(t2) 

DatetimeIndex(['2005-03-13 17:00:00', '2005-03-13 17:30:00', 
       '2005-03-13 18:00:00', '2005-03-13 18:30:00', 
       '2005-03-13 19:00:00', '2005-03-13 19:30:00', 
       '2005-03-13 20:00:00', '2005-03-13 20:30:00', 
       '2005-03-13 21:00:00', '2005-03-13 21:30:00', 
       '2005-03-13 22:00:00', '2005-03-13 22:30:00', 
       '2005-03-13 23:00:00', '2005-03-13 23:30:00', 
       '2005-03-14 00:00:00'], 
       dtype='datetime64[ns]', freq=None) 
+0

这很好,但是我在解决方案后可以将数据分成多个2个差距超过1个。下面的Stephen Rauch更接近我的想法。但是,谢谢! –