Как удалить миллисекунды и искаженные данные в pandas

#python #pandas #time

#python #pandas #время

Вопрос:

Привет всем, я новичок в pandas, у меня есть сигнал ЭКГ, который содержит сотни тысяч строк, потому что его измерения принимаются каждую миллисекунду. таким образом, я хочу изменить данные, чтобы сделать это за считанные секунды, и удалить миллисекунды и соответствующий им сигнал ЭКГ.

                  Time    ECG1   ECG2
2020-10-09 15:55:49.004 -5.19   -5.19
2020-10-09 15:55:49.008 -5.19   -5.19
2020-10-09 15:55:49.012 -5.19   -5.19
  

Комментарии:

1. Пожалуйста, добавьте образец желаемого выходного фрейма данных

2.2020-10-09 15:55:49 -5.19 -5.19 2020-10-09 15:55:50 -5.19 -5.19 2020-10-09 15:55:51 -5.19 -5.19

Ответ №1:

То, что вы описываете, похоже на вопрос о повторной выборке. Удаление дублирования или получение только максимального значения каждую секунду — это не тот способ, которым я бы рассматривал временные ряды.

Ниже я создаю серию данных из 500 точек данных с интервалом в 2 секунды. Это создаст примерно 1 точку данных каждые 4 миллисекунды.

Переход ко второму интервалу теперь можно просто выполнить с помощью resample() .

 import pandas as pd
import numpy as np

# create dummy data
df= pd.DataFrame({'time': pd.date_range(start="1/1/2020 10:00:00", end="1/1/2020 10:00:02", periods=500)})
df['ECG1'] = np.array([[i]*100 for i in [5.19, 5.2, 5.21, 5.22, 5.23]]).flatten()
df['ECG2'] = df['ECG1'] 0.1
print(df.head(5))

# resample to 1s intervalls, taking the mean over the 1-s period
new_df = df.set_index('time').resample("1s").mean()
print(new_df)
  

Это дает:

                            time  ECG1  ECG2
0 2020-01-01 10:00:00.000000000  5.19  5.29
1 2020-01-01 10:00:00.004008016  5.19  5.29
2 2020-01-01 10:00:00.008016032  5.19  5.29
3 2020-01-01 10:00:00.012024048  5.19  5.29
4 2020-01-01 10:00:00.016032064  5.19  5.29
                         ECG1      ECG2
time                                   
2020-01-01 10:00:00  5.198000  5.298000
2020-01-01 10:00:01  5.221968  5.321968
2020-01-01 10:00:02  5.230000  5.330000
  

Ответ №2:

Сначала я воссоздаю ваш df

 d={'Time':['2020-10-09 15:55:49.004' , '2020-10-09 15:55:49.008', '2020-10-09 15:55:49.012'  ]  ,  'ECG1':[-5.19  , -5.19  ,-5.19  ] ,  'ECG2':[-5.19  ,-5.19  ,-5.19  ]}
df = pd.DataFrame(data=d)
  

затем мне нужно время даты и времени для времени столбца

 df['Time'] = pd.to_datetime(df['Time'])
  

Поэтому я могу использовать метод floor, чтобы получить время только до минут

 df['Time'] = df['Time'].dt.floor('s')
  

Если у вас есть дублированные строки, вы можете удалить их с помощью метода drop_duplicates

 df.drop_duplicates(inplace=True)
  

Мой вывод:
введите описание изображения здесь

Комментарии:

1. Это решение имеет ту же проблему, в результате вы получите несколько записей в секунду, как только значения измерений для ECG1 и ECG2 переключаются в течение второго интервала.