Python panda df迭代,基于时间(以毫秒为单位)对数据进行分块

Python panda df迭代,基于时间(以毫秒为单位)对数据进行分块,python,pandas,loops,dataframe,binning,Python,Pandas,Loops,Dataframe,Binning,我重新确定了问题的重点,并尽可能具体。下面,我还包括我迄今为止使用过的代码 import pyodbc import pandas as pd import numpy as np conn = pyodbc.connect('Driver={SQL Server};' 'Server=XXXXXXXXX;' 'Database=Dynamics;' 'Trus

我重新确定了问题的重点,并尽可能具体。下面,我还包括我迄今为止使用过的代码

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) 当从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'),但在位置0处获取“错误解析日期时间字符串”time”

(2) 我试图将我的数据按2个因素分组,首先是“数据2”,然后是“时间”。这是因为我的数据不会按以下顺序排列,而是按随机顺序排列。我得到:“DataFrameGroupBy”不可调用。这是因为我有重复的data2值吗?你能帮忙解释一下是什么引起的吗

(3) 因此,在我按“data2”和“time”对数据进行分组后,我需要在预定义的时间间隔内(即[0=10ms]、[10-20ms)等)对数据进行存储,例如,第0,1,2行将位于[0-10ms)存储箱下。因此,我需要能够首先定义这些存储箱(我将有一组固定的存储箱)。然后,对于下一个“data2”更改(例如从55岁到56岁),我们将开始时间设置为0,并根据从0到data2再次更改所经过的时间对行数据进行装箱。依此类推。我如何编写此代码,最困难的是将计时器设置为“0”,并在“data2”值未更改的情况下为每行引用“time”。然后,当“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

熊猫有一个很好的日期范围特性。下面是一个创建一分钟范围的示例,每行有一个新的毫秒(这也是索引)

这是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毫秒。

欢迎使用StackOverflow。如果您发布代码并向我们说明出现了什么问题,您将更容易得到响应。另外,请包含Python代码以在图像中重新创建列,因为1)我们中的一些人看不到图像,2)让我们重新创建您的列是一个负担。添加了一些Python,可以更容易地复制初始数据帧。您可能想查看或获取如何将日期时间分组到存储箱中的示例。@rajah9非常感谢您的建议,它提供了一些很好的指导,因此我有now将我的问题重新调整为更具体的问题,并包含了我迄今为止设法编写的代码。感谢所有人的帮助!(为了使问题更简单,我调整了我最初问题的内容,并尽可能具体)@rajah9-太好了,我已经在考虑你的建议,并得到了一些有意义的结果。非常感谢!