pandas:对来自多个 csv 文件的新数据框中的列使用截断的文件名作为 header,读取特定列,将日期设置为索引
pandas: Use truncated filename as header for column in new dataframe from multiple csv files, read specific columns, set date as index
我阅读了多个与此类似的问题,但并未专门针对此用例。
我在一个文件夹中有多个 ticker.csv 个文件,例如:
ZZZ.TO.csv 包含:
Date Open High Low Close Volume
0 2017-03-14 28.347332 28.347332 27.871055 28.267952 22400
1 2017-03-15 28.320875 28.400254 27.959257 28.188574 39200
2 2017-03-16 28.179758 28.797155 28.126837 28.708954 51600
3 2017-03-17 28.576658 28.691315 28.091559 28.550196 57400
我想创建一个包含每个文件中所有 'Date' 和 'Close' 数据的数据框。将 'Date' 设置为索引,并将每个代码作为最终数据帧中的 header 列。
所以最终的数据框看起来像这样:
Date FOO.TO ZOMD.V ZEN.V TICKER.BAR
2017-03-14 28.347332 28.347332 27.871055 28.267952
2017-03-15 28.320875 28.400254 27.959257 28.188574
2017-03-16 28.179758 28.797155 28.126837 28.708954
2017-03-17 28.576658 28.691315 28.091559 28.550196
这是我试过的:
import pandas as pd
import glob
path = r'/path_where_files_are/'
all_files = glob.glob(path + "/*.csv")
all_files.sort()
fields = ['Date','Close']
list = []
for filename in all_files:
df = pd.read_csv(filename, header=0, usecols=fields)
df.set_index(['Date'], inplace=True)
list.append(df)
frame = pd.concat(list, axis=0)
但它产生:
Date Close
2017-03-14 0.050000
2017-09-21 0.040000
2017-09-22 0.040000
2017-10-13 0.100000
2017-10-16 0.110000
欢迎任何帮助。干杯。
有几件事可以帮助您:
- 您想水平连接,所以使用
pd.concat(..., axis=1)
或 pd.concat(..., axis='columns')
;
- 阅读后不要忘记重命名数据框中的“关闭”列;
- 最好不要覆盖 Python built-ins 的名称——因此不要使用
list
,而是使用描述性的内容,例如dfs_to_merge
.
你可以试试:
import pandas as pd
import pathlib
path = pathlib.Path(r'./data2')
data = {}
for filename in sorted(path.glob('*.csv')):
data[filename.stem] = pd.read_csv(filename, index_col='Date',
usecols=['Date', 'Close'],
parse_dates=['Date']).squeeze()
df = pd.concat(data, axis=1)
输出:
>>> df
ZEN.V ZZZ.TO
Date
2017-03-14 28.267952 28.267952
2017-03-15 28.188574 28.188574
2017-03-16 28.708954 28.708954
2017-03-17 28.550196 28.550196
我阅读了多个与此类似的问题,但并未专门针对此用例。
我在一个文件夹中有多个 ticker.csv 个文件,例如:
ZZZ.TO.csv 包含:
Date Open High Low Close Volume
0 2017-03-14 28.347332 28.347332 27.871055 28.267952 22400
1 2017-03-15 28.320875 28.400254 27.959257 28.188574 39200
2 2017-03-16 28.179758 28.797155 28.126837 28.708954 51600
3 2017-03-17 28.576658 28.691315 28.091559 28.550196 57400
我想创建一个包含每个文件中所有 'Date' 和 'Close' 数据的数据框。将 'Date' 设置为索引,并将每个代码作为最终数据帧中的 header 列。
所以最终的数据框看起来像这样:
Date FOO.TO ZOMD.V ZEN.V TICKER.BAR
2017-03-14 28.347332 28.347332 27.871055 28.267952
2017-03-15 28.320875 28.400254 27.959257 28.188574
2017-03-16 28.179758 28.797155 28.126837 28.708954
2017-03-17 28.576658 28.691315 28.091559 28.550196
这是我试过的:
import pandas as pd
import glob
path = r'/path_where_files_are/'
all_files = glob.glob(path + "/*.csv")
all_files.sort()
fields = ['Date','Close']
list = []
for filename in all_files:
df = pd.read_csv(filename, header=0, usecols=fields)
df.set_index(['Date'], inplace=True)
list.append(df)
frame = pd.concat(list, axis=0)
但它产生:
Date Close
2017-03-14 0.050000
2017-09-21 0.040000
2017-09-22 0.040000
2017-10-13 0.100000
2017-10-16 0.110000
欢迎任何帮助。干杯。
有几件事可以帮助您:
- 您想水平连接,所以使用
pd.concat(..., axis=1)
或pd.concat(..., axis='columns')
; - 阅读后不要忘记重命名数据框中的“关闭”列;
- 最好不要覆盖 Python built-ins 的名称——因此不要使用
list
,而是使用描述性的内容,例如dfs_to_merge
.
你可以试试:
import pandas as pd
import pathlib
path = pathlib.Path(r'./data2')
data = {}
for filename in sorted(path.glob('*.csv')):
data[filename.stem] = pd.read_csv(filename, index_col='Date',
usecols=['Date', 'Close'],
parse_dates=['Date']).squeeze()
df = pd.concat(data, axis=1)
输出:
>>> df
ZEN.V ZZZ.TO
Date
2017-03-14 28.267952 28.267952
2017-03-15 28.188574 28.188574
2017-03-16 28.708954 28.708954
2017-03-17 28.550196 28.550196