Pandas Dataframe 日期时间索引 Concat/Merge/Join 破坏了索引顺序

Pandas Dataframe Datetime Indices Concat/Merge/Join corrupts index order

考虑 2 个包含具有 DateTime 索引的水位数据的 .csv 文件。可以从以下网址下载: 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'.

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

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

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

和 joining/merging 导致 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)

这正是使用 merge/join 得到的 DataFrame 的长度。

有办法解决这个问题吗?

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

P.P.S。大多数文件包含重复索引。尝试使用 index.drop_duplicate 似乎什么也没做。

解决方案

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

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

示范[​​=25=]
result.plot()

@piRSquared 将 numpy 导入为 np 将 pandas 导入为 pd 导入 glob 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" 的文件夹将创建全局变量。