【问题标题】:Python pandas ambiguous time indexPython pandas 模糊时间索引
【发布时间】:2017-09-25 00:13:30
【问题描述】:

在这里查看我的 pandas 数据框:

                       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()

我得到不同的值,但仍然是相同的时间列 (=index)。我想每秒只保留一行具有相应的平均值。 非常感谢您的帮助 - 谢谢!

【问题讨论】:

    标签: python pandas indexing time average


    【解决方案1】:

    您可以在索引上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
    

    【讨论】:

    • 完美!从文件中读取数据时有没有办法做到这一点(使用read_csv)?这不是强制性的,但很高兴知道
    • 您可以读取块并压缩每个块,但如果条目跨越多个块,那么您最终还是会执行上述操作。这真的取决于这里的文件大小,我会发布更新
    • 查看更新有助于减少初始阅读,但您仍需要再次groupby
    • 好的,数据框没有这么大,需要分块读取。不过很高兴知道 - 谢谢。
    猜你喜欢
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 1970-01-01
    • 2020-01-02
    • 2021-01-16
    • 2016-06-12
    相关资源
    最近更新 更多