Панды добавляют приращение к отметке времени, чтобы разорвать связи, сохраняя первоначальный порядок - PullRequest
1 голос
/ 25 апреля 2019

У меня есть датафрейм в формате

   df = pandas.DataFrame([{'tstamp':'2019-03-06 06:42:13.582500', 'value' : 1},
    {'tstamp':'2019-03-06 06:43:28.937400', 'value':   2},
    {'tstamp':'2019-03-06 06:43:28.937400', 'value' :   -1},
    {'tstamp':'2019-03-06 06:43:28.937400', 'value' :   2},
    {'tstamp':'2019-03-06 06:43:28.937400', 'value' :   -4},
    {'tstamp':'2019-03-06 06:43:37.237500', 'value' :    1},
    {'tstamp':'2019-03-06 06:43:37.237500', 'value' :    1},
    {'tstamp':'2019-03-06 06:43:37.237500', 'value' :    1},
    {'tstamp':'2019-03-06 06:47:25.470300', 'value' :    3},
    {'tstamp':'2019-03-06 06:47:54.791500', 'value' :    4},
    {'tstamp':'2019-03-06 06:49:11.971600', 'value' :   5},
    {'tstamp':'2019-03-06 06:49:11.971600', 'value' :    2},
    {'tstamp':'2019-03-06 06:49:33.285500', 'value' :    1},
    {'tstamp':'2019-03-06 06:49:42.414700', 'value' :   10},
    {'tstamp':'2019-03-06 06:49:55.300300', 'value' :   11},
    {'tstamp':'2019-03-06 06:49:55.300300', 'value' :    9},
    {'tstamp':'2019-03-06 06:52:03.992600', 'value' :   -1},
    {'tstamp':'2019-03-06 06:52:03.992600', 'value' :    2}])

Некоторые метки времени имеют связи.

У меня такой вопрос: как эффективно добавить только ту временную дельту к индексу строк с привязкой, чтобы разорвать связи в индексе, сохранив порядок данных?

@ jezrael:

Мне нужно создать новый столбец 'tstamp', назовем его 'tstamp2', который удовлетворяет следующим условиям:

  • (df.sort_values('tstamp2').index == df.sort_values('tstamp').index).all() Верно,
  • df.tstamp2.duplicated().any() Ложь,
  • (df[~df.tstamp.duplicated()].tstamp == df[~df.tstamp.duplicated()].tstamp2).all() Верно,

1 Ответ

1 голос
/ 25 апреля 2019

Если преобразование формата 'tstamp' в np.datetime в порядке, то это должно работать:

df['tstamp2'] = pandas.to_datetime(df.tstamp)
df['tstamp2'] += pandas.to_timedelta(df.groupby(df.tstamp2).cumcount(), unit='ns')
# Condition 1:
# Out: True
# Condition 2:
# Out: False
# Condition 3:
# Out: True

Предполагая, что "достаточно времени" является наносекундой (unit='ns').

Если вы хотите сохранить 'tstamp' в виде строк, ваша задача может быть выполнена следующим образом:

df['tstamp2'] = df.tstamp + df.groupby(df.tstamp).cumcount().astype(str)
# Condition 1:
# Out: True
# Condition 2:
# Out: False
# Condition 3:
# Out: True

Оба метода удовлетворяют всем трем условиям.

...