【问题标题】:Pandas Dataframe Datetime Indices Concat/Merge/Join corrupts index orderPandas Dataframe Datetime Indices Concat/Merge/Join 损坏索引顺序
【发布时间】:2016-08-23 09:41:15
【问题描述】:

考虑 2 个 .csv 文件,其中包含具有 DateTime 索引的水位数据。可以从以下位置下载: https://www.dropbox.com/sh/50zaz9ore00j7rp/AAA2MhNrNMRImoSBWWcUBNp4a?dl=0

导入如下:

pbn61 = pd.read_csv('3844_61.csv, 
                                 index_col = 0, 
                                 delimiter = ';', 
                                 dayfirst = True, 
                                 usecols = ['Datumtijd','DisplayWaarde']
                   )

第二个文件也一样。全局变量“pbn65”。

现在我想合并这 2 个 DataFrame,以便我可以在一个图中绘制两个数据序列。这样做的原因是我有大约 50 个这些文件,而且它们都没有相同的开始日期和/或时间。所以合并一些会大大减少我最终得到的图表的数量。

现在我只想要两个系列中都可用的数据,因为只有这样数据才能与研究相关。因此我使用以下代码:

pbn65.columns = ['DisplayWaarde2']

result1 = pd.merge(pbn61,pbn65, left_index = True, right_index = True, how='inner')
result2 = pbn65.join(pbn61, how = 'inner')

pd.set_option('max_rows', 25000)
result2

我需要重命名一列以确保它可以加入。增加最大行数以显示计数错误

这两种方式都会导致相同的问题。那就是索引放错了顺序。现在这可能是因为索引是表单的 DateTime

DD-MM-YYYY HH:MM

加入/合并会导致 pandas 计数 Decimal 而不是 DateTime。

连接两个 DataFrame 会出现以下错误:

result3 = pd.concat([pbn61,pbn65], axis = 1, join = 'inner')
result3

Shape of passed values is (2, 20424), indices imply (2, 19558)

这正是使用合并/连接生成的 DataFrame 的长度。

有没有办法解决这个问题?

附:我想保留一个 DateTime 索引,因为我需要一个时间指示来进行评估。

附言大多数文件包含重复的索引。尝试使用index.drop_duplicate 似乎无济于事。

【问题讨论】:

    标签: datetime pandas indexing dataframe corrupt


    【解决方案1】:

    解决方案

    pbn61 = pd.read_csv('3844_61.csv', 
                                     index_col = 0, 
                                     delimiter = ';', 
                                     dayfirst = True, 
                                     usecols = ['Datumtijd','DisplayWaarde'],
                                     parse_dates = [0],
                       )
    
    pbn65 = pd.read_csv('3847_65.csv', 
                                     index_col = 0, 
                                     delimiter = ';', 
                                     dayfirst = True, 
                                     usecols = ['Datumtijd','DisplayWaarde'],
                                     parse_dates = [0],
                       )
    
    pbn61 = pbn61.groupby(level=0).first()
    pbn65 = pbn65.groupby(level=0).first()
    
    result = pd.concat([pbn61, pbn65], axis=1).dropna()
    

    说明

                                     parse_dates = [0],
    

    parse_dates 指定应将哪一列解析为日期

    pbn61 = pbn61.groupby(level=0).first()
    

    这会处理重复的索引。 drop_duplicates 负责处理重复记录。

    result = pd.concat([pbn61, pbn65], axis=1).dropna()
    

    这将两者合并。我觉得这更直观。有很多方法可以做到这一点。

    演示

    result.plot()
    

    【讨论】:

    • 哇。我完全忘记了'parse_dates'。那条小线修复了它。非常感谢。但是,包含“parse_dates”是否会大大增加处理时间?我有 63 个文件需要用 'parse_dates' 处理,大约 20.000 行。我测量了它,10 和 20 分别用了 40 和 80 秒。可能有更快的方法吗?我将发布完整的代码作为答案。
    【解决方案2】:

    @piRSquared 将 numpy 导入为 np 将熊猫导入为 pd 导入全局 pd.版本

    Files = glob.glob('Peilbuizen/*.csv') 
    
    def Invoer(F):
        F = Files
        for i in range(len(Files)):
            globals()['pbn%s' % Files[i][16:-1-3]] = pd.read_csv(Files[i], 
                                                                 index_col = 0,
                                                                 delimiter = ';',
                                                                 dayfirst = True,
                                                                 usecols = ['Datumtijd','DisplayWaarde'],
                                                                 parse_dates =[0]
                                                                )
    
    Invoer(Files)
    
    pbn11 = pbn11.groupby(level = 0).first()
    pbn13 = pbn13.groupby(level = 0).first()
    
    result = pd.concat([pbn11, pbn13], axis = 1).dropna()
    result.plot()
    

    我将 Dropbox 文件夹更新为 10 个文件以进行实验。在 python 保存目录中创建一个名为“Peilbuizen”的文件夹将创建全局变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-18
      • 2018-07-28
      • 2019-08-07
      相关资源
      最近更新 更多