Как прочитать несколько CSV-файлов и построить гистограмму - PullRequest
2 голосов
/ 25 апреля 2020

Я уже задавал тот же вопрос, и он выглядел неясным. Поэтому позвольте мне задать его по-другому. У меня есть четыре файла .csv с именем I_earthquake2016.csv I_earthquake2017.csv I_earthquake2018.csv I_earthquake2019.csv (данные о землетрясениях в разные годы) у всех одинаковые столбцы только количество строк разное. Я сделал несколько кодов, чтобы прочитать один из файлов, и сделал гистограмму, чтобы увидеть, сколько землетрясений происходит каждый месяц.

Вопросы:

  • Я не знаю, как сделать код для чтения всех файлов и построения одной и той же гистограммы для каждого из них (используйте l oop)
  • Я не знаю, как составить гистограмму для отображения количества землетрясений за каждый год (между 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 Ответ

1 голос
/ 27 апреля 2020

РЕДАКТИРОВАТЬ: Включены отсортированные в назначении 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 , однако я предпочитаю встроенную реализацию pathlib glob . Оба позволяют искать шаблон регулярных выражений (например, * .csv), см. Цитату из документов ниже:

Перетащите указанный относительный шаблон в каталог, представленный этим путем, получив все соответствующие файлы (любого типа)

Приведенный ниже код дает вам список pandas DataFrame. Аргумент parse_dates=['time'] автоматически переводит время столбца в дату и время. Так что вам больше не нужно pd.to_datetime(). Вам нужно будет адаптировать базу в base_dir, чтобы она соответствовала правильному каталогу на вашем p c.

# 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: Построить несколько гистограмм

В приведенном ниже коде вы можете создать подзаговор 2 x 2 с plt.subplots(). Я перебираю список фреймов данных вместе со списком осей с zip(df_list,fig.get_axes()) и распакуйте их получившийся кортеж * (df, axes) в переменные to df и ax. В l oop я использую векторизованный .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)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...