python pandas合并多个csv文件

时间:2018-01-01 15:56:55

标签: python pandas csv datetime

我有大约600个csv文件数据集,它们都有相同的列名['DateTime','Actual','Consensus','Previous','Revised'],所有经济指标和所有时间序列数据集

目标是将它们合并在一个csv文件中。

以'DateTime'作为索引。

我想要将此文件编入索引的方式是时间线方式,这意味着让我们说第一个csv中的第一个事件发布在12/18/2017 10:00:00,第一个事件发生在第二个csv中的日期为12 / 29/2017 2017:00 09:00和第三次csv的第一次活动日期为12/20/2017 09:00:00。

所以,我希望将它们编入索引后面的第一个和更新的一个,等等,尽管源csv来自它。

我试图合并其中只有3个作为实验而问题是'DateTime',因为它会像这样将它们中的3个打印在一起(' 12/18/2017 10:00:00' ,' 12/29/2017 09:00:00',' 12/20/2017 09:00:00') 这是代码:

json-to-xml

4 个答案:

答案 0 :(得分:6)

考虑使用read_csv() args, index_col parse_dates ,在导入期间创建索引并将其格式化为datetime。然后运行所需的水平合并。下面假设日期在csv的第一列。最后在最终数据帧上使用sort_index()来对日期时间进行排序。

df1 = pd.read_csv(r"E:\Business\Economic Indicators\Consumer Price Index - Core (YoY) - European Monetary Union.csv",
                  index_col=[0], parse_dates=[0])
df2 = pd.read_csv(r"E:\Business\Economic Indicators\Private loans (YoY) - European Monetary Union.csv",
                  index_col=[0], parse_dates=[0])
df3 = pd.read_csv(r"E:\Business\Economic Indicators\Current Account s.a - European Monetary Union.csv",
                  index_col=[0], parse_dates=[0])

finaldf = pd.concat([df1, df2, df3], axis=1, join='inner').sort_index()

对于DRY-er方法,特别是在数百个csv文件中,使用列表理解

import os
...
os.chdir('E:\\Business\\Economic Indicators')

dfs = [pd.read_csv(f, index_col=[0], parse_dates=[0])
        for f in os.listdir(os.getcwd()) if f.endswith('csv')]

finaldf = pd.concat(dfs, axis=1, join='inner').sort_index()

答案 1 :(得分:2)

您正在尝试从许多数据框的行中构建一个大型数据框,这些数据框都具有相同的列名。 axis应为0(默认值),而不是1.此外,您不需要指定连接类型。这将没有任何效果,因为每个数据帧的列名都相同。

df = pd.concat([df1, df2, df3])

应该足以连接数据集。

(见https://pandas.pydata.org/pandas-docs/stable/merging.html

您对set_index的调用使用DateTime列中的值来定义索引应该可以正常工作。

答案 2 :(得分:0)

问题有两个:将csv合并到一个数据帧中,然后按日期排序。

正如约翰史密斯指出要沿行合并数据帧,你需要使用:

df = pd.concat([df1,df2,df3])

然后,您要根据索引设置索引并重新排序数据帧。

df.set_index('DateTime', inplace=True)
df.sort_index(inplace=True)

或按降序排列

df.sort_index(inplace=True,ascending=False)

(见https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.sort_index.html

timeindex = pd.date_range('2018/01/01','2018/01/10')
randtimeindex = np.random.permutation(timeindex)
# Create three dataframes
df1 = pd.DataFrame(index=range(3),data=np.random.rand(3,3),
                columns=['Actual','Consensus','DateTime'])
df1.DateTime=randtimeindex[:3]
df2 = pd.DataFrame(index=range(3),data=np.random.rand(3,3),
                columns=['Actual','Consensus','DateTime'])
df2.DateTime=randtimeindex[3:6]
df3 = pd.DataFrame(index=range(4),data=np.random.rand(4,3),
                columns=['Actual','Consensus','DateTime'])
df3.DateTime=randtimeindex[6:]

# Merge them
df4 = pd.concat([df1, df2, df3], axis=0)

# Reindex the merged dataframe, and sort it
df4.set_index('DateTime', inplace=True)
df4.sort_index(inplace=True, ascending=False)

print(df4.head())

答案 3 :(得分:0)

macOS