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" 的文件夹将创建全局变量。
考虑 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
我需要重命名一列以确保它可以加入。增加最大行数以显示计数错误
两种方式都会导致同样的问题。那就是索引放错了顺序。现在这可能是因为索引是
形式的 DateTimeDD-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()
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" 的文件夹将创建全局变量。