如何读取多个 csv 文件并绘制直方图
How to read multiple csv files and plot histogram
我已经问过同样的问题,看起来是 unclear.So 让我用不同的方式问一下 way.I 有四个名为 I_earthquake2016.csv I_earthquake2017.csv 的 .csv 文件I_earthquake2018.csv I_earthquake2019.csv(不同年份的地震数据)
它们都有相同的列,只是行数不同。
我编写了一些代码来读取其中一个文件,并制作直方图以查看每个月发生了多少次地震。
问题:
- 我不知道如何编写代码来读取所有文件并绘制
他们每个人都有相同的直方图(使用循环)
- 我不会做直方图
显示每年(2016-2019 年)的地震次数
谁能教我怎么做。谢谢。
import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
data = pd.read_csv('I_earthquake2017.csv')
print(data[:1])
输出第 1 行:
time latitude longitude depth mag
0 2017-12-30 20:53:24.700000+00:00 29.4481 51.9793 10.0 4.9
data['time']=pd.to_datetime(data['time'])
data['MONTH']=data['time'].dt.month
data['YEAR']=data['time'].dt.year
print(data[:1])
输出行 1
time latitude longitude depth mag MONTH YEAR
0 2017-12-30 20:53:24.700000+00:00 29.4481 51.9793 10.0 4.9 12 2017
plt.hist(x=[data.MONTH],bins=12,alpha=0.5)
plt.show()
编辑: 在 csv_list 的分配中包含一个排序以按正确的顺序重新排列子图
更改行 -> csv_list = sorted(list(base_dir.glob("*.csv")))
所以我模拟了你的数据(对于那些感兴趣的人,模拟代码是这个答案的最后一部分)
代码的必要导入
#!/usr/bin/env python3
import calendar
from pathlib import Path
import matplotlib.pyplot as plt
import pandas as pd
答案 1:读取多个 .csv 文件
有图书馆glob, however I prefer the built-in pathlib implementation of glob。两者都允许您搜索正则表达式模式(如 *.csv),请参阅文档中的以下引述:
Glob the given relative pattern in the directory represented by this
path, yielding all matching files (of any kind)
下面的代码为您提供了一个 pandas DataFrame 的列表。参数 parse_dates=['time']
自动将列时间转换为日期时间。所以你不再需要 pd.to_datetime()
了。您需要调整 base_dir
中的基础以匹配您电脑上的正确目录。
# Read in mulitple CSV Files
base_dir = Path("C:/Test/Earthquake-Data")
csv_list = sorted(list(base_dir.glob("*.csv")))
df_list = [pd.read_csv(file, index_col=0,parse_dates=['time']) for file in csv_list]
答案 2:绘制多个直方图
您可以在下面的代码中使用 plt.subplots()
创建一个 2 x 2 子图(df, axes) 在变量 df
和 ax
中。在循环中,我在时间列上使用矢量化 .dt.month
来创建直方图并更改一些外观参数,即:
- 子图的标题设置为年份
title=str(df['time'].dt.year[0])
- 将 x-axis 刻度上的标签设置为缩写的月份名称(存储在
list(calendar.month_abbr[1:])
中)。请在我回答的第一部分(上文)中认出我import calendar
。
- 旋转 x-labels(缩写月份)以提高可读性
代码:
fig, ax = plt.subplots(2,2)
for df, ax in zip(df_list,fig.get_axes()):
df['time'].dt.month.plot(kind="hist",ax=ax,bins=12,title=str(df['time'].dt.year[0]))
ax.set_xticks(range(1,13))
ax.set_xticklabels(list(calendar.month_abbr[1:]))
# Rotate the xticks for increased readability
for tick in ax.get_xticklabels():
tick.set_rotation(45)
fig.tight_layout()
plt.show()
模拟地震数据
#!/usr/bin/env python3
import numpy as np
import pandas as pd
from my_utils.advDateTime import random_datetimes
from pathlib import Path
year_range = range(2016,2020)
time = [random_datetimes(pd.to_datetime(f"1/1/{year}"), pd.to_datetime(f"1/1/{year + 1}"), n=100) \
for year in year_range]
lattitude = [np.random.randint(0,100,100) for i in range(4)]
data = {'Lattitude': lattitude[0],'time':time[0]}
list_dfs = [pd.DataFrame({'Lattitude': data,'time':y}).sort_values("time").reset_index(drop=True) for data,y in zip(lattitude,time)]
# # Export to CSV
base_dir = Path("C:/Test/Earthquake-Data")
[df.to_csv(base_dir/f"I_earthquake{year}.csv") for df,year in zip(list_dfs,year_range)]
我已经问过同样的问题,看起来是 unclear.So 让我用不同的方式问一下 way.I 有四个名为 I_earthquake2016.csv I_earthquake2017.csv 的 .csv 文件I_earthquake2018.csv I_earthquake2019.csv(不同年份的地震数据) 它们都有相同的列,只是行数不同。 我编写了一些代码来读取其中一个文件,并制作直方图以查看每个月发生了多少次地震。
问题:
- 我不知道如何编写代码来读取所有文件并绘制 他们每个人都有相同的直方图(使用循环)
- 我不会做直方图 显示每年(2016-2019 年)的地震次数
谁能教我怎么做。谢谢。
import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
data = pd.read_csv('I_earthquake2017.csv')
print(data[:1])
输出第 1 行:
time latitude longitude depth mag
0 2017-12-30 20:53:24.700000+00:00 29.4481 51.9793 10.0 4.9
data['time']=pd.to_datetime(data['time'])
data['MONTH']=data['time'].dt.month
data['YEAR']=data['time'].dt.year
print(data[:1])
输出行 1
time latitude longitude depth mag MONTH YEAR
0 2017-12-30 20:53:24.700000+00:00 29.4481 51.9793 10.0 4.9 12 2017
plt.hist(x=[data.MONTH],bins=12,alpha=0.5)
plt.show()
编辑: 在 csv_list 的分配中包含一个排序以按正确的顺序重新排列子图
更改行 -> csv_list = sorted(list(base_dir.glob("*.csv")))
所以我模拟了你的数据(对于那些感兴趣的人,模拟代码是这个答案的最后一部分)
代码的必要导入
#!/usr/bin/env python3
import calendar
from pathlib import Path
import matplotlib.pyplot as plt
import pandas as pd
答案 1:读取多个 .csv 文件
有图书馆glob, however I prefer the built-in pathlib implementation of glob。两者都允许您搜索正则表达式模式(如 *.csv),请参阅文档中的以下引述:
Glob the given relative pattern in the directory represented by this path, yielding all matching files (of any kind)
下面的代码为您提供了一个 pandas DataFrame 的列表。参数 parse_dates=['time']
自动将列时间转换为日期时间。所以你不再需要 pd.to_datetime()
了。您需要调整 base_dir
中的基础以匹配您电脑上的正确目录。
# Read in mulitple CSV Files
base_dir = Path("C:/Test/Earthquake-Data")
csv_list = sorted(list(base_dir.glob("*.csv")))
df_list = [pd.read_csv(file, index_col=0,parse_dates=['time']) for file in csv_list]
答案 2:绘制多个直方图
您可以在下面的代码中使用 plt.subplots()
创建一个 2 x 2 子图(df, axes) 在变量 df
和 ax
中。在循环中,我在时间列上使用矢量化 .dt.month
来创建直方图并更改一些外观参数,即:
- 子图的标题设置为年份
title=str(df['time'].dt.year[0])
- 将 x-axis 刻度上的标签设置为缩写的月份名称(存储在
list(calendar.month_abbr[1:])
中)。请在我回答的第一部分(上文)中认出我import calendar
。 - 旋转 x-labels(缩写月份)以提高可读性
代码:
fig, ax = plt.subplots(2,2)
for df, ax in zip(df_list,fig.get_axes()):
df['time'].dt.month.plot(kind="hist",ax=ax,bins=12,title=str(df['time'].dt.year[0]))
ax.set_xticks(range(1,13))
ax.set_xticklabels(list(calendar.month_abbr[1:]))
# Rotate the xticks for increased readability
for tick in ax.get_xticklabels():
tick.set_rotation(45)
fig.tight_layout()
plt.show()
模拟地震数据
#!/usr/bin/env python3
import numpy as np
import pandas as pd
from my_utils.advDateTime import random_datetimes
from pathlib import Path
year_range = range(2016,2020)
time = [random_datetimes(pd.to_datetime(f"1/1/{year}"), pd.to_datetime(f"1/1/{year + 1}"), n=100) \
for year in year_range]
lattitude = [np.random.randint(0,100,100) for i in range(4)]
data = {'Lattitude': lattitude[0],'time':time[0]}
list_dfs = [pd.DataFrame({'Lattitude': data,'time':y}).sort_values("time").reset_index(drop=True) for data,y in zip(lattitude,time)]
# # Export to CSV
base_dir = Path("C:/Test/Earthquake-Data")
[df.to_csv(base_dir/f"I_earthquake{year}.csv") for df,year in zip(list_dfs,year_range)]