Python的大熊猫暧昧时间指数

问题描述:

在这里看到我的熊猫数据框:Python的大熊猫暧昧时间指数

     press222 
datetime      
2017-03-31 14:02:04 110.854683 
2017-03-31 14:02:04 110.855759 
2017-03-31 14:02:04 110.855103 
2017-03-31 14:02:04 110.853790 
2017-03-31 14:02:05 110.854034 
2017-03-31 14:02:05 110.855103 
2017-03-31 14:02:05 110.854683 
2017-03-31 14:02:05 110.855698 
2017-03-31 14:02:05 110.853851 
2017-03-31 14:02:06 110.854385 
2017-03-31 14:02:06 110.853905 
2017-03-31 14:02:06 110.854988 
2017-03-31 14:02:06 110.854988 
2017-03-31 14:02:06 110.854988 

你可以看到,我有每秒多个值,但遗憾的是时间标记在整个秒(记录器没有吐出毫秒) ,这使得它不明确。有什么方法可以得到属于“同一秒”的值的平均值,因此在本例中,平均值为14:02:04,一个为05,一个为06?

(实际数据框当然是太长手工做的...)

我试图滚动的意思是这样:

df.rolling('S').mean() 

我得到不同的值,但仍然是相同的时间列(=索引)。我想每秒只保留一行,并显示相应的平均值。 希望你的帮助 - 谢谢!

,你可以对指数groupby并调用mean

In [285]: 
df.groupby(level=0).mean() 

Out[285]: 
        press222  
datetime       
2017-03-31 14:02:04  110.854834 
2017-03-31 14:02:05  110.854674 
2017-03-31 14:02:06  110.854651 

因此,所有重复的值塌陷成一个单一的日期时间录入

要做到这一点阅读,你可以在块读取并执行上述但是如果重复条目跨越大块,您仍然需要执行上述操作,但它会压缩第一个读取df:

In [291]:  
import io 
import pandas as pd 
t="""datetime,press222  
2017-03-31 14:02:04,110.854683 
2017-03-31 14:02:04,110.855759 
2017-03-31 14:02:04,110.855103 
2017-03-31 14:02:04,110.853790 
2017-03-31 14:02:05,110.854034 
2017-03-31 14:02:05,110.855103 
2017-03-31 14:02:05,110.854683 
2017-03-31 14:02:05,110.855698 
2017-03-31 14:02:05,110.853851 
2017-03-31 14:02:06,110.854385 
2017-03-31 14:02:06,110.853905 
2017-03-31 14:02:06,110.854988 
2017-03-31 14:02:06,110.854988 
2017-03-31 14:02:06,110.854988""" 
chunks=[] 
for chunk in pd.read_csv(io.StringIO(t), parse_dates=[0], index_col=[0], chunksize=3): 
    chunks.append(chunk.groupby(level=0).mean()) 
final_df = pd.concat(chunks) 
final_df 

Out[291]: 
        press222  
datetime       
2017-03-31 14:02:04  110.855182 
2017-03-31 14:02:04  110.853790 
2017-03-31 14:02:05  110.854568 
2017-03-31 14:02:05  110.854744 
2017-03-31 14:02:06  110.854426 
2017-03-31 14:02:06  110.854988 

你可以看到,我们仍然有重复的条目,但DF比,如果我们没有预先处理,所以我们仍然需要将groupby再次进行小:

In [292]: 
final_df.groupby(level=0).mean() 

Out[292]: 
        press222  
datetime       
2017-03-31 14:02:04  110.854486 
2017-03-31 14:02:05  110.854656 
2017-03-31 14:02:06  110.854707 
+0

完美!在读取文件中的数据(使用'read_csv')时有没有办法做到这一点?这不是强制性的,但很高兴知道 – Robert

+0

您可以分块读取并压缩每个块,但是如果条目跨越多个块,那么最终您会完成上述操作。这真的取决于文件的大小,我会发布一个更新 – EdChum

+0

看到更新它有助于减少最初的阅读,但你仍然需要再次'groupby' – EdChum