如何读取多个csv文件并绘制直方图

时间:2020-04-25 08:07:08

标签: python csv matplotlib histogram

我已经问过同样的问题,而且看起来还不清楚,所以让我以不同的方式提问。我有四个.csv文件,名为I_earthquake2016.csv I_earthquake2017.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()

1 个答案:

答案 0 :(得分:1)

编辑:在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,但是我更喜欢glob的内置pathlib实现。两者都允许您搜索正则表达式模式(例如* .csv),请参见以下文档引文:

在此表示的目录中遍历给定的相对模式 路径,生成所有匹配的文件(任何形式)

下面的代码为您提供了熊猫DataFrame的列表。参数parse_dates=['time']自动将列时间转换为日期时间。因此,您不再需要pd.to_datetime()。您需要调整base_dir中的基数以匹配您PC上的正确目录。

# 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子图,然后遍历数据框列表和使用zip(df_list,fig.get_axes())的轴列表,并将它们解压缩为*(df ,轴)到变量dfax中。在循环中,我在时间列上使用矢量化的.dt.month来创建直方图并更改某些外观参数,即:

  1. 设置为title=str(df['time'].dt.year[0])年的子图的标题
  2. 将x轴刻度上的标签设置为缩写的月份名称(存储在list(calendar.month_abbr[1:])中)。请确认答案的第一部分(上方)是我import calendar
  3. 旋转x标签(缩写月份)以提高可读性

代码:

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)]
相关问题