Кадр данных отбрасывается между временными рядами путем сдвига временной шкалы - PullRequest
0 голосов
/ 20 марта 2020

Я хотел бы отбросить несколько групп строк по критерию времени. Критерий даты может быть проигнорирован. У меня есть фрейм данных, который содержит 100 миллионов строк, с частотой выборки около 0,001 с, но он варьируется для разных столбцов. Цель состоит в том, чтобы отбросить несколько строк по критерию «смещение». Продолжительность отпуска может составлять 0,01 секунды, а продолжительность сброса может составлять 0,1 секунды, как показано на рисунке:

The idea of dropping rows

У меня много проблем с меткой времени во времени преобразования и с определением oneliner, который будет отбрасывать несколько групп строк. Я сделал попытки со следующим кодом:

import pandas as pd
from datetime import timedelta#, timestamp
from datetime import datetime
import numpy as np

# leave_duration=0.01 seconds
# drop_duration=0.1 seconds

i = pd.date_range('2018-01-01 00:01:15.004', periods=1000, freq='2ms')
i=i.append(pd.date_range('2018-01-01 00:01:15.004', periods=1000, freq='3ms'))
i=i.append(pd.date_range('2018-01-01 00:01:15.004', periods=1000, freq='0.5ms'))
df = pd.DataFrame({'A': range(len(i))}, index=i)
df=df.sort_index()

minimum_time=df.index.min()
print("Minimum time:",minimum_time)
maximum_time=df.index.max()
print("Maximum time:",maximum_time)

# futuredate = minimum_time + timedelta(microseconds=100)

print("Dataframe before dropping:\n",df)
df.drop(df.between_time(*pd.to_datetime([minimum_time, maximum_time]).time).index, inplace=True)
print("Dataframe after dropping:\n",df)

# minimum_time=str(minimum_time).split()
# minimum_time=minimum_time[1]
# print(minimum_time)
# maximum_time=str(maximum_time).split()
# maximum_time=maximum_time[1]
# print(maximum_time)

Как я могу отбросить строки по временному критерию со сдвигом?

Ответы [ 2 ]

2 голосов
/ 21 марта 2020

работает для меня:

df = df.loc[(df.index - df.index[0]) % pd.to_timedelta('110ms') > pd.to_timedelta('100ms')]
1 голос
/ 20 марта 2020

Я * думаю, это то, что вы ищете. Если нет, то, надеюсь, это приблизит вас.

Я определил периоды отбрасывания, взяв минимальное время и увеличивая его на время сброса / ухода. Затем я добавляю его в словарь, где ключ - это начало периода отбрасывания, а значение - конец периода отбрасывания.

Наконец, я просто перебираю словарь и удаляю строки, которые попадают между этими двумя разами в вашем фрейме данных, отбрасывая строки на каждом шаге.

drop_periods = {}
start_drop = minimum_time + datetime.timedelta(seconds=0.01)
end_drop = start_drop + datetime.timedelta(seconds=0.1)
drop_periods[start_drop] = end_drop
while end_drop < maximum_time:
    start_drop = end_drop + datetime.timedelta(seconds=0.01)
    end_drop = start_drop + datetime.timedelta(seconds=0.1)
    drop_periods[start_drop] = end_drop


for start, end in drop_periods.items():
    print("Dataframe before dropping:\n", len(df))
    df.drop(df.between_time(*pd.to_datetime([start, end]).time).index, inplace=True)
    print("Dataframe after dropping:\n", len(df))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...