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



我重新关注了我的问题,并尽可能具体。下面,我还包括了到目前为止我使用过的代码;

(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",然后是"时间"。这是因为我的数据不会按以下顺序排列,而是按随机顺序排列。我得到:"DataFrameGroupBy"不可调用。这是因为我有重复的data2值吗?你能帮我找出原因吗?

(3( 因此,在我将数据按"data2"one_answers"时间"分组后,然后,我需要在预定义的时间间隔内(即[0=10ms(、[10-20ms(对数据进行bin,因此行0,1,2将属于[0-10ms(bin。因此,我需要能够首先定义这些bin(我将有一组固定的bin(。然后,对于下一个"data2"更改(例如,从55更改为56(,我们将开始时间设置为0,并根据从0到data2再次更改所经过的时间对行数据进行bin。等等。我该如何编码呢?我最困难的地方是将计时器设置为"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

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有一个很好的重采样功能,在本例中,它将10ms仓中的值相加。

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

请注意,最后一个值要小得多,因为只表示了1ms。

相关内容

最新更新