Добавление дат к элементам списка во вложенных списках

У меня есть список списков (образец ниже) - и я пытаюсь получить следующее

1) Если текущий месяц находится в первой половине года, то для i во входных датах добавьте current_year в конец i. А также для i в year_second_half добавьте yr + 1 к i во входных датах, которые попадают в year_second_half

Пример - «5 августа 19:45» заменяется «5 августа 19:45 2018», а «2 января 15:00» становится «2 января 15:00 2019».

2) Если текущий месяц находится в year_second_half, то для i в input_dates добавьте текущий год к концу i, где месяц находится во второй половине года. А также за все месяцы в i приходящиеся на первую половину года, добавьте год - 1 к тем

Пример (предположим, что месяц май) - «6 апреля 15:00» становится «6 апреля 15:00 2018» и «5 августа, 19:45 2017».

currentYear = datetime.now().year
this_yr = currentYear

currentMonth = datetime.now().month
this_month = currentMonth

year_first_half = ['August', 'September', 'October', 'November', 'December']
year_second_half = ['January', 'February', 'March', 'April', 'May']

input_dates =   [['5th August 19:45','8th December 12:30','16th December 16:00',
                '3rd January 20:00','12th January 15:00','19th January 15:00','30th January 20:00',
                '2nd February 15:00'],['9th December 15:00','23rd December 15:00',
                '27th December 20:00','2nd January 15:00','9th January 15:00',
                '6th April 15:00','27th April 15:00','4th May 15:00','12th May 15:00']]

newlist = []

for x in input_dates:
    for i in x:
        for month in year_first_half:
            if month in i and this_month in year_first_half:
                i = (i + ' {}').format(this_yr)
            elif month in i and this_month in year_second_half:
                i = (i + ' {}').format(this_yr - 1)    

        for month in year_second_half:
            if month in i and this_month not in year_second_half:
                i = (i + ' {}').format(this_yr + 1)

            elif month in i and this_month in year_second_half:
                i = (i + ' {}').format(this_yr) 



        newlist.append(i)
print(newlist)

Токовый выход -

['5th August 19:45 2018', '8th December 12:30 2018', '16th December 16:00 2018', '3rd January 20:00 2019', '12th January 15:00 2019', '19th January 15:00 2019', '30th January 20:00 2019', '2nd February 15:00 2019', '9th December 15:00 2018', '23rd December 15:00 2018', '27th December 20:00 2018', '2nd January 15:00 2019', '9th January 15:00 2019', '6th April 15:00 2019', '27th April 15:00 2019', '4th May 15:00 2019', '12th May 15:00 2019']

Кажется, это работает, но я хотел бы вывести список списков в том же формате и порядке, в котором я его получил, за исключением добавления года, как показано выше.

Когда я запускаю свой код, я получаю только один список. Есть лучший способ сделать это? Цель этой задачи - просто обновить список, указав правильные годы.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
170
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, что здесь происходит, так это то, что 1-й цикл for в input_dates запускает два раз, поскольку у вас есть 2 списка внутри списка (input_dates). Следовательно, вам нужно создать еще один список, который будет добавлять список, созданный при выполнении каждого цикла for.

Также я изменил логику кода.

Вот модифицированный код:

from datetime import datetime
from dateutil.parser import parse
import numpy as np
import pandas as pd

currentYear = datetime.now().year
currentMonth = datetime.now().strftime("%B")

year_first_half = ['August', 'September', 'October', 'November', 'December']
year_second_half = ['January', 'February', 'March', 'April', 'May']

input_dates =   [['5th August 19:45','8th December 12:30','16th December 16:00',
                '3rd January 20:00','12th January 15:00','19th January 15:00','30th January 20:00',
                '2nd February 15:00'],['9th December 15:00','23rd December 15:00',
                '27th December 20:00','2nd January 15:00','9th January 15:00',
                '6th April 15:00','27th April 15:00','4th May 15:00','12th May 15:00']]

outer_list = []
for x in input_dates:
    inner_list = []
    for i in x:
        each_entry = parse(i)
        if currentMonth in year_first_half:
            if each_entry.strftime("%B") in year_first_half:
                i = (i + ' {}').format(currentYear)
            else:
                i = (i + ' {}').format(currentYear + 1)
        elif currentMonth in year_second_half:
            if each_entry.strftime("%B") in year_second_half:
                i = (i + ' {}').format(currentYear)
            else:
                i = (i + ' {}').format(currentYear - 1)
        inner_list.append(i)
    outer_list.append(inner_list)
print(outer_list)

Спасибо. Выполните это, и это вернет два одинаковых списка. Я хотел, чтобы возвращаемые списки выглядели как input _dates, за исключением того, что в конце каждого элемента списка в каждом списке помещался правильный_yr.

anfield 05.12.2018 00:31

Навин, см. Мой предыдущий комментарий

anfield 05.12.2018 03:36

У кого-нибудь есть предложения о том, как мне сделать то, что мне нужно?

anfield 05.12.2018 17:12

@anfield Я изменил вашу логику.

Naveen 06.12.2018 20:43

навин спасибо. Это определенно хорошо. Единственное, он дважды печатает список списков с одинаковыми элементами.

anfield 07.12.2018 22:13

Можете ли вы поделиться тем, что вы получили? В моем случае все работает нормально.

Naveen 07.12.2018 22:29

Я отредактировал свой исходный пост с помощью вывода, он также ниже [['5 августа 19:45 2018', '8 декабря 12:30 2018', '16 декабря 16:00 2018', '3 января 20:00 2019 ',' 12 января 15:00 2019 ',' 19 января 15:00 2019 ',' 30 января 20:00 2019 ',' 2 февраля 15:00 2019 '], [' 9 декабря 15:00 2018 ',' 23 декабря 15:00 2018, 27 декабря 20:00 2018, 2 января 15:00 2019, 9 января 15:00 2019, 6 апреля 15:00 2019, 27 апреля 15:00 2019 ',' 4 мая 15:00 2019 ',' 12 мая 15:00 2019 ']]

anfield 08.12.2018 02:20

@anfield: но вы просили тот же формат, что и input_dates. Пожалуйста, отредактируйте свои вопросы и опубликуйте желаемый результат. Я могу изменить его в зависимости от желаемого результата.

Naveen 08.12.2018 03:43

благодаря. это работает правильно. По какой-то причине он печатал результат дважды, но не сейчас

anfield 11.12.2018 04:34

Другие вопросы по теме