Вопросы по datetime, major tick label in matplotlib и if __name__ == '__main__':

Vlad_SD

Активный пользователь
Пользователь
Апр 7, 2020
91
45
18
Всем добрый день. Изучаю Python , прохожу работу с данными из файла. Изначальная задача: взять данные из excel и нарисовать по ним два графика в matplotlib. Почитав докумнетацию и другие ресурсы, для работы с файлом выбрал openpyxl, в итоге получилось так, что для каждого стобика нужно делать свой цикл, чтобы перебрать все значения. Всё нарисовалось, но осталось пара вопросов, которые я так и не смог решить.
1. Как использовать datetime, чтобы из даты вида 09.03.2020 06:00 получить красивую 09.03.20
2. Хочу, чтобы major tick label оси ординат были вертикальными, вроде бы нащёл как это делается, но не получилось или лучше чтобы размер шрифта был меньше для них
3. if __name__ == '__main__': эта строка была в исходном примере учебника, понял, что она не позовляет запускать скрипт из вне, объясните, пожалуйста, что это и когда уместно применять.

Таблица чуть болье 1.5 мб, во вложения не влезла
Excel таблица с погодными данными для анализа

Код получился сложным для чтения, надеюсь, примерно понятно будет)

Собсвенно сам скрипт:
Python:
import openpyxl
import matplotlib.pyplot as plt


def read_values(file_city_name):
    """Читает excel файл (шапка --> дата, температура --> столбцы)"""
    sheet = wb_archangelsk.active
    # Получить данные из шапки (имя города, точка росы)
    city_name = sheet['A1'].value
    dew_point_header = sheet['W2'].value
    return city_name, dew_point_header


def read_time_temp(file_city_name):
    sheet = wb_archangelsk.active
    temp_list, time_list, first_dew_point, coordinate = [], [], [], []
    # берёт значения даты из столбца А
    for a_cell in sheet['A']:
        if "02.2020 18:00" in str(a_cell.value):
            time_list.append(a_cell.value)
            coordinate.append(a_cell.coordinate)
    # берём температуру на основе координат столца А из столбца В
    for i in range(len(coordinate)):
        coordinate[i] = f"B{coordinate[i][1::]}"
        temp_list.append(sheet[f"{coordinate[i]}"].value)
    # берём температуру выпадения осадков на основе координат  столбца А  из столбца W
    for i in range(len(coordinate)):
        coordinate[i] = f"W{coordinate[i][1::]}"
        first_dew_point.append(sheet[f"{coordinate[i]}"].value)

    return time_list[::-1], temp_list[::-1], first_dew_point[::-1]


def date_plt(current_time, current_temp, current_city, current_dew_point):
    """отображение данных на диаграмме"""
    # задаём область и размер фигуры
    fig, ax = plt.subplots()
    fig.set_figwidth(12)
    fig.set_figheight(8)
    # передаём данные в печать
    plt.plot(current_time, current_temp, c='red', alpha=0.9)
    plt.plot(current_time, current_dew_point, c='blue', alpha=0.9)
    plt.fill_between(current_time,
                     current_temp,
                     current_dew_point,
                     facecolor='blue',
                     alpha=0.1
                     )
    # формирование заголовка, оси абцисс и ординат на диаграмме, сетки графика
    plt.title(f'Температура воздуха, выпадения осадков в Апреле в {current_city}')
    plt.xlabel('', fontsize=10)
    plt.ylabel('Температура(С)', fontsize=10)
    fig.autofmt_xdate()
    # настройка клеток сетки графика
    ax.minorticks_on()
    ax.grid(which='major',
            color='k')
    ax.grid(which='minor',
            color='gray',
            linestyle=':')
    plt.show()


if __name__ == '__main__':
    wb_archangelsk = openpyxl.load_workbook('C:\Date Downloading\Arh\Arhangelsc.xlsx')
    time, temp, dew_point = read_time_temp(wb_archangelsk)
    city_plt, dew_point_plt = read_values(wb_archangelsk)

    date_plt(time, temp, city_plt, dew_point)
 
  • Мне нравится
Реакции: Student

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
1. Как использовать datetime, чтобы из даты вида 09.03.2020 06:00 получить красивую 09.03.20
Нужно конвертировать строку в дату с помощью datetime.strptime, а потом снова в строку с помощью strftime.
2. Хочу, чтобы major tick label оси ординат были вертикальными, вроде бы нащёл как это делается, но не получилось или лучше чтобы размер шрифта был меньше для них
Показал в коде как сменить и шрифт и направление
3. if __name__ == '__main__': эта строка была в исходном примере учебника, понял, что она не позовляет запускать скрипт из вне, объясните, пожалуйста, что это и когда уместно применять.
Эта строка выполнит код, который расположен под ней в случае если имя модуля '__main__' , то есть если файл запущен самостоятельно, а не импортирован в другой файл (там имя модуля будет равно имени файла скрипта). Нужно это для того чтобы менять поведение программы в зависимости от того импортирован ли модуль или нет.
Вот немного переделанный код:
Python:
import openpyxl
import matplotlib.pyplot as plt
from datetime import datetime


def read_values(file_city_name):
    """Читает excel файл (шапка --> дата, температура --> столбцы)"""
    sheet = wb_archangelsk.active
    # Получить данные из шапки (имя города, точка росы)
    city_name = sheet['A1'].value
    dew_point_header = sheet['W2'].value
    return city_name, dew_point_header


def read_time_temp(file_city_name):
    sheet = wb_archangelsk.active
    temp_list, time_list, first_dew_point, coordinate = [], [], [], []
    # берёт значения даты из столбца А
    for a_cell in sheet['A']:
        if "02.2020 18:00" in str(a_cell.value):

            # конвертируем строку в дату
            t = datetime.strptime(a_cell.value, "%d.%m.%Y %H:%M")

            # конвертируем обратно в короткую строку
            time_list.append(t.strftime("%d.%m.%y"))

            coordinate.append(a_cell.coordinate)
    # берём температуру на основе координат столца А из столбца В
    for i in range(len(coordinate)):
        coordinate[i] = f"B{coordinate[i][1::]}"
        temp_list.append(sheet[f"{coordinate[i]}"].value)
    # берём температуру выпадения осадков на основе координат  столбца А  из столбца W
    for i in range(len(coordinate)):
        coordinate[i] = f"W{coordinate[i][1::]}"
        first_dew_point.append(sheet[f"{coordinate[i]}"].value)

    return time_list[::-1], temp_list[::-1], first_dew_point[::-1]


def date_plt(current_time, current_temp, current_city, current_dew_point):
    """отображение данных на диаграмме"""
    # задаём область и размер фигуры
    fig, ax = plt.subplots()
    fig.set_figwidth(12)
    fig.set_figheight(8)
    # передаём данные в печать
    plt.plot(current_time, current_temp, c='red', alpha=0.9)
    plt.plot(current_time, current_dew_point, c='blue', alpha=0.9)
    plt.fill_between(current_time,
                     current_temp,
                     current_dew_point,
                     facecolor='blue',
                     alpha=0.1
                     )
    # формирование заголовка, оси абцисс и ординат на диаграмме, сетки графика
    plt.title(f'Температура воздуха, выпадения осадков в Апреле в {current_city}')
    plt.xlabel('', fontsize=10)

    # меняем направление шрифта тиков по оси ординат
    plt.yticks(rotation='vertical')

    plt.ylabel('Температура(С)', fontsize=10)
    fig.autofmt_xdate()
    # настройка клеток сетки графика
    ax.minorticks_on()

    # меняем размер шрифта у тиков на оси ординат
    ax.tick_params(axis='y', which='major', labelsize=8)

    ax.grid(which='major',
            color='k')
    ax.grid(which='minor',
            color='gray',
            linestyle=':')
    plt.show()


if __name__ == '__main__':
    wb_archangelsk = openpyxl.load_workbook('Arhangelsc.xlsx')
    time, temp, dew_point = read_time_temp(wb_archangelsk)
    city_plt, dew_point_plt = read_values(wb_archangelsk)

    date_plt(time, temp, city_plt, dew_point)
 
  • Мне нравится
Реакции: Vlad_SD и Student

Максим Грушин

Пользователь
Пользователь
Апр 10, 2020
63
8
8
19
Тюмень
Можешь попробовать вот так
Python:
from datetime import datetime
current_datetime = datetime.now()

def data():
    print(current_datetime.year, current_datetime.month, current_datetime.day )

data()
 
  • Мне нравится
Реакции: Vlad_SD и Student

Vlad_SD

Активный пользователь
Пользователь
Апр 7, 2020
91
45
18
Нужно конвертировать строку в дату с помощью datetime.strptime, а потом снова в строку с помощью strftime.

Показал в коде как сменить и шрифт и направление

Эта строка выполнит код, который расположен под ней в случае если имя модуля '__main__' , то есть если файл запущен самостоятельно, а не импортирован в другой файл (там имя модуля будет равно имени файла скрипта). Нужно это для того чтобы менять поведение программы в зависимости от того импортирован ли модуль или нет.
Вот немного переделанный код:
Python:
import openpyxl
import matplotlib.pyplot as plt
from datetime import datetime


def read_values(file_city_name):
    """Читает excel файл (шапка --> дата, температура --> столбцы)"""
    sheet = wb_archangelsk.active
    # Получить данные из шапки (имя города, точка росы)
    city_name = sheet['A1'].value
    dew_point_header = sheet['W2'].value
    return city_name, dew_point_header


def read_time_temp(file_city_name):
    sheet = wb_archangelsk.active
    temp_list, time_list, first_dew_point, coordinate = [], [], [], []
    # берёт значения даты из столбца А
    for a_cell in sheet['A']:
        if "02.2020 18:00" in str(a_cell.value):

            # конвертируем строку в дату
            t = datetime.strptime(a_cell.value, "%d.%m.%Y %H:%M")

            # конвертируем обратно в короткую строку
            time_list.append(t.strftime("%d.%m.%y"))

            coordinate.append(a_cell.coordinate)
    # берём температуру на основе координат столца А из столбца В
    for i in range(len(coordinate)):
        coordinate[i] = f"B{coordinate[i][1::]}"
        temp_list.append(sheet[f"{coordinate[i]}"].value)
    # берём температуру выпадения осадков на основе координат  столбца А  из столбца W
    for i in range(len(coordinate)):
        coordinate[i] = f"W{coordinate[i][1::]}"
        first_dew_point.append(sheet[f"{coordinate[i]}"].value)

    return time_list[::-1], temp_list[::-1], first_dew_point[::-1]


def date_plt(current_time, current_temp, current_city, current_dew_point):
    """отображение данных на диаграмме"""
    # задаём область и размер фигуры
    fig, ax = plt.subplots()
    fig.set_figwidth(12)
    fig.set_figheight(8)
    # передаём данные в печать
    plt.plot(current_time, current_temp, c='red', alpha=0.9)
    plt.plot(current_time, current_dew_point, c='blue', alpha=0.9)
    plt.fill_between(current_time,
                     current_temp,
                     current_dew_point,
                     facecolor='blue',
                     alpha=0.1
                     )
    # формирование заголовка, оси абцисс и ординат на диаграмме, сетки графика
    plt.title(f'Температура воздуха, выпадения осадков в Апреле в {current_city}')
    plt.xlabel('', fontsize=10)

    # меняем направление шрифта тиков по оси ординат
    plt.yticks(rotation='vertical')

    plt.ylabel('Температура(С)', fontsize=10)
    fig.autofmt_xdate()
    # настройка клеток сетки графика
    ax.minorticks_on()

    # меняем размер шрифта у тиков на оси ординат
    ax.tick_params(axis='y', which='major', labelsize=8)

    ax.grid(which='major',
            color='k')
    ax.grid(which='minor',
            color='gray',
            linestyle=':')
    plt.show()


if __name__ == '__main__':
    wb_archangelsk = openpyxl.load_workbook('Arhangelsc.xlsx')
    time, temp, dew_point = read_time_temp(wb_archangelsk)
    city_plt, dew_point_plt = read_values(wb_archangelsk)

    date_plt(time, temp, city_plt, dew_point)
Большое спасибо, 5 раз уже посмотрел примеры про if __name__ == '__main__': на YouTube, и только с вашего объяснения действительно понял зачем нужна эта конструкция. Наконец-то ;)
 

Форум IT Специалистов