pandas TimeSeries diff () возвращается к серии

Я работаю с некоторыми данными TimeSeries в этом формате:

1984-12-12 14:08:00
1984-12-12 14:25:00
1984-12-12 14:47:00
1984-12-12 16:37:00
1984-12-12 16:37:00
1984-12-12 16:37:00
1984-12-12 17:52:00
1984-12-12 17:52:00
1984-12-12 19:29:00

За последние несколько days! , казалось, было несколько простых операций (приятный день), превратилось в хаки и мрачно.

Вот так: reqs btw:

  • разницу между некоторыми строками в TimeSeries
  • сгенерируйте совпадение различий.

Во-первых, когда я подхожу к пандам и всей парадигме group-apply-combine , мне нравится делать это

  • создать некоторую группу над DataFrame
  • написать функцию, которая принимает объект группы и возвращает объект группы
  • использовать lamda для передачи групп в функцию

Я считаю, что это стандартно, и причина, по которой мне это нравится, – это неявная конкатенация групп, нескольких столбцов и новая вставка столбцов. (он также удаляет цикл по группам, упрощает векторизацию) … но я думаю, что у него проблемы с пустыми группами …

Во всяком случае, чтобы получить различия в TimeSeries, я нашел использование shift() чтобы получить разницу во времени, StopIteration ошибку StopIteration , с использованием diff(1) не было ошибок.

Однако новый дельта-столбец (разность во времени между строками с событиями) превращается в серию.

 time ev delta 1984-12-12 14:08:00 1 NaT 1984-12-12 14:25:00 1 00:17:00 1984-12-12 14:47:00 1 00:22:00 1984-12-12 16:37:00 0 01:50:00 1984-12-12 16:37:00 1 01:50:00 1984-12-12 16:37:00 0 01:50:00 1984-12-12 17:52:00 0 01:15:00 1984-12-12 17:52:00 1 01:15:00 1984-12-12 19:29:00 1 01:37:00 

Попытка конвертировать Series в TimeSeries оказалась бесплодной. Ошибка выдается из-за проблемы с форматом (очень длинное число + L встречается не в формате часа, минуты, секунды), это, по-видимому, прервет всю попытку и попытается уловить Cant.

  try: pd.to_datetime(d['delta'], format='%H:%M:%S') except: pass 

Еще одна ошибка, которая продолжает появляться, – ошибка StopIteration от получения суммы времени.

 gg['cumt'] = pd.rolling_apply( gg['time'], 2, np.sum ) gg['cumt'] = pd.rolling_sum(gg['time'],2).shift(1) gg['cumt'] = gg.apply(lambda x: pd.expanding_sum(x['time'], min_periods=2) ) 

Я считаю, что простая cumsum не cumsum ошибку, gg['cumt'] = gg['tavg'].cumsum() , но проблема формирования времени заставляет строку преобразовывать в некоторый int, и они суммируются как крошечные числа ,

Любая помощь, общая или конкретная, оценивается:

Мне нравится простая идея написать функцию и вернуть группу. Хавент слишком много исследовал функцию transform (не думайте, что я могу заставить ее работать); возвращает возвращаемые модифицированные группы в функции, устраняя необходимость в преобразованиях / вещании. Это то, что вызывает мою ошибку StopIteration ? Я чувствую, что он не может иметь дело с некоторыми пустяками?

Pandas 0.12.0, Numpy 1.7.1, Python 2.7.5, Linux Mint

 import pandas as pd import StringIO data = '''time 1984-12-12 14:08:00 1984-12-12 14:25:00 1984-12-12 14:47:00 1984-12-12 16:37:00 1984-12-12 16:37:00 1984-12-12 16:37:00 1984-12-12 17:52:00 1984-12-12 17:52:00 1984-12-12 19:29:00''' df = pd.read_csv(StringIO.StringIO(data)) df['time'] = pd.DatetimeIndex(df['time']) df['delta'] = df['time'].diff() #df['delta'] = pd.TimeSeries(df['delta']) # sorry, not needed #df['delta'][0] = 0 # to remove NaT # better method to remove NaT - thanks to Jeff df['delta'] = df['delta'].fillna(0) df['cumsum'] = df['delta'].cumsum() print df 

результат

  time delta cumsum 0 1984-12-12 14:08:00 00:00:00 00:00:00 1 1984-12-12 14:25:00 00:17:00 00:17:00 2 1984-12-12 14:47:00 00:22:00 00:39:00 3 1984-12-12 16:37:00 01:50:00 02:29:00 4 1984-12-12 16:37:00 00:00:00 02:29:00 5 1984-12-12 16:37:00 00:00:00 02:29:00 6 1984-12-12 17:52:00 01:15:00 03:44:00 7 1984-12-12 17:52:00 00:00:00 03:44:00 8 1984-12-12 19:29:00 01:37:00 05:21:00