panda df итерация, сбор данных на основе времени в миллисекундах - PullRequest
0 голосов
/ 20 февраля 2020

Я перефокусировал свои вопросы и попытался указать как можно точнее c. ниже я также включил код, который использовал до сих пор:

(1) При извлечении данных из SQL мое время находится в смешанном формате, который содержит букву, с которой трудно работать. Чтобы избежать проблем с этим, я пытался подать заявку; df.time = pd.to_timedelta (df.time, unit = 'ms'), что хорошо, если вы не знаете, как извлечь часы и минуты. Пример; 2019.11.22D01: 18: 00.01000, мне просто нужно иметь столбец «время» в следующем формате; '01: 18: 00,01000. Может быть, я могу использовать 'np.datetime64', чтобы преобразовать все мои записи SQL в нужный формат и обрезать необходимое количество символов? Пожалуйста, посоветуйте команду. Я также пытался 'data = np.datetime64 (' time '), но получал' Ошибка синтаксического анализа строки даты и времени "time" в позиции 0 ".

(2) Я пытаюсь сгруппировать данные ниже по 2 факторам, сначала «data2», а затем «time». Это потому, что мои данные будут не в порядке ниже, а в случайном порядке. Я получаю: DataFrameGroupBy не вызывается. Это потому, что у меня есть повторяющиеся значения data2? Не могли бы вы помочь с тем, что вызывает это?

(3) Так что после того, как я сгруппировал свои данные по 'data2' и 'time', мне нужно затем поместить данные в заданные интервалы времени (т. Е. [0 = 10ms), [10-20ms) et c), поэтому строки 0,1,2 попадут, например, в корзину [0-10ms). Таким образом, мне нужно сначала определить эти ячейки (у меня будет фиксированный набор корзин). Затем, для следующего изменения «data2» (скажем, от 55 до 56), мы устанавливаем время начала равным 0 и помещаем в строку данные строки, основанные на времени, прошедшем от 0 до тех пор, пока data2 снова не изменится. И так далее. Как я могу кодировать это, где я больше всего борюсь с установкой таймера на «0» и ссылкой на «время» для каждой строки, пока значение «data2» не изменилось. Затем, когда изменяется «data2», начинайте все сначала, соответственно разбивая данные.

Ниже приведен код, который я использовал до сих пор;

import pyodbc 
import pandas as pd
import numpy as np

conn = pyodbc.connect('Driver={SQL Server};'
                      'Server=XXXXXXXXX;'
                      'Database=Dynamics;'
                      'Trusted_Connection=yes;')

cursor = conn.cursor()

SQL_Query = pd.read_sql_query('''select ID,time,data1,data2,data3,data4,data5 from Dynamics''', conn)
df = pd.DataFrame(SQL_Query, columns=['ID','time','data2','data3','data4','data5'])
df.time=pd.to_timedelta(df.time, unit='ms')
df[['data4']] = df[['data4']].apply(pd.to_numeric)
df['diff']=df['data4']-df['data5']
df['diff']=df['diff'].abs()
df=df.groupby(['data3','time'])
print(df)



                     time data_1  data_2 data_3  data_4  data_5
0 2019-11-22 01:18:00.010      a      55      A    1.20    1.24
1 2019-11-22 01:18:00.090      a      55      B    1.25    1.24
2 2019-11-22 01:18:00.100      a      55      C    1.26    1.24
3 2019-11-22 01:18:00.140      a      55      A    1.22    1.22
4 2019-11-22 01:18:00.160      a      55      B    1.23    1.22

1 Ответ

1 голос
/ 29 февраля 2020

Pandas имеет отличную функцию диапазонов дат. Вот пример, который создает одноминутный диапазон с новой миллисекундой в каждой строке (которая также является индексом).

import pandas as pd
from datetime import timedelta
import numpy as np

date_rng = pd.date_range(start='2019-11-22T01:18:00.00100', end='2019-11-22T01:19:00.00000', freq='ms') #one minute, in milliseconds
n = len(date_rng) # n = 60000
values = np.random.random(n) # make n random numbers

df = pd.DataFrame({'values': values}, index=date_rng)
print ('dataframe: ')
print (df.head())

Это заголовок df:

dataframe: 
                           values
2019-11-22 01:18:00.001  0.914796
2019-11-22 01:18:00.002  0.760555
2019-11-22 01:18:00.003  0.132992
2019-11-22 01:18:00.004  0.572391
2019-11-22 01:18:00.005  0.090188

Далее, Pandas имеет замечательную функцию повторной выборки, которая в этом примере суммирует значения в бинах по 10 мс.

df2 = df.resample(rule=timedelta(milliseconds=10)).sum() # df2 sums the values in 10 ms bins
print ('beginning of df2')
print (df2.head())
print ('...')
print (df2.tail())

Вот вывод:

beginning of df2
                           values
2019-11-22 01:18:00.000  5.236037
2019-11-22 01:18:00.010  4.446964
2019-11-22 01:18:00.020  6.549635
2019-11-22 01:18:00.030  5.141522
2019-11-22 01:18:00.040  5.375919
...
                           values
2019-11-22 01:18:59.960  3.876523
2019-11-22 01:18:59.970  4.864252
2019-11-22 01:18:59.980  5.690987
2019-11-22 01:18:59.990  2.787247
2019-11-22 01:19:00.000  0.613545

Обратите внимание, что последнее значение намного меньше, так как отображается только 1 мс.

...