У меня есть DateTimeIndex, например: вы можете видеть, что метки времени расположены равномерно, за исключением середины, где происходит переход с '2005-03-11 15:00:00' на '2005-03-13 17:30:00'.

Как можно программно разделить DateTimeIndex в точке отсутствующей отметки времени и вернуть 2 DateTimeIndex?

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
jim basquiat 7 Янв 2017 в 06:56

4 ответа

Лучший ответ

Вы можете использовать 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'
])
1
Stephen Rauch 7 Янв 2017 в 18:12

Я предполагаю, что различия постоянны до того момента, когда мы разделимся.

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)
1
piRSquared 7 Янв 2017 в 06:24

Это должно работать. У вас также были некоторые синтаксические ошибки.

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
Matt Shirley 7 Янв 2017 в 05:59
DateTimeIndex1=''
DateTimeIndex2=''
for i in DateTimeIndex:
 if '30:00' in i[0]:
  DateTimeIndex1+=i[0]
 else:
  DateTimeIndex2+=i[0]

Попробуйте приведенный выше код, надеюсь, это поможет

0
Omi Harjani 7 Янв 2017 в 04:08