我有来自St.Louis Fred的50个csv
价格指数数据文件,每个文件的格式如下:
我想组合多个csv文件并向其添加一行标题以实现以下格式:
所以我可以将数据存储在一个csv文件中,我可以知道有什么办法可以用Python做到吗?
答案 0 :(得分:3)
重复DATE
列并不合理。除非有某些特定目的。此外,在合并时,您需要注意特定行上的数据属于同一日期。
如果您使用 DATE 作为索引合并并使用 OUTER 方法合并,则最好使用pandas。因此,同一天的值在同一行。
import pandas as pd;
df1 = pd.read_table('file1.csv', sep=',')
df2 = pd.read_table('file2.csv', sep=',')
df3 = pd.read_table('file3.csv', sep=',')
因此,基本上将您拥有的所有文件作为数据框加载。然后使用merge
或reduce
函数合并文件。
data_frames = [df1, df2, df3]
您可以在上面的代码中添加任意数量的数据框。
然后合并它们。要保留属于同一日期的值,您需要将其合并到DATE
df_merged = reduce(lambda left,right: pd.merge(left,right,on=['DATE'],
how='outer'), data_frames)
然后将合并的数据写入csv文件。
pd.DataFrame.to_csv(df_merged, 'merged.txt', sep=',', na_rep='.', index=False)
这应该给你
DATE VALUE1 VALUE2 VALUE3 ....
答案 1 :(得分:1)
Pandas是一个很好的解决方案,但是如果你想要一个python std lib解决方案:
Sub MAIN()
Dim i As Long
For i = 3 To Sheets.Count
Sheets(i).Activate
Call dural
Next i
End Sub
答案 2 :(得分:1)
这将垂直连接所提供目录中的所有文件(因此您不必在代码中指定它们)。这些文件可以包含任意数量的列,并且可以处理值中的空格。但是,文件必须具有相同的行数。
它仅使用模块csv和os。
import os
import csv
dir_base = r'H:\apps\xp\Desktop\localrepo\Temp'
dir_name = '-test2'
output_name = 'output.csv'
path = os.path.join(dir_base, dir_name)
out_path = os.path.join(dir_base, output_name)
def _extend(lines, lineno, line):
try:
lines[lineno].extend(line)
except IndexError:
lines.append(line)
def main():
lines = []
# read and generate new file
for root, dirs, files in os.walk(path):
for f in files:
with open(os.path.join(root, f), 'r') as csvfile:
f_in = csv.reader(csvfile)
for lineno, line in enumerate(f_in, start=1):
if lineno == 1:
header = [''] * len(line)
header[0] = f
_extend(lines, 0, header)
_extend(lines, lineno, line)
# print new file
with open(out_path, 'w', newline='\n') as csvfile:
csv.writer(csvfile).writerows(lines)
if __name__ == '__main__':
main()
如果你的" csv"文件有其他分隔符(因此在技术上不是" c" sv文件),只需更改代码csv.reader(csvfile)
的这一部分以指示分隔符,例如csv.reader(csvfile, delimiter='|')
。
希望它有所帮助!