Нарезка строк с использованием пользовательского ввода на основе YYMM в разных столбцах

#python #pandas #dataframe #input

#питон #pandas #фрейм данных #ввод

Вопрос:

Я подумал о том, чтобы попробовать этот вопрос из-за предыдущих успешных ответов. Это будет сложно, у меня есть этот простой вывод с использованием Panda, извлеченный из файла CSV,

 Timeline: 1900 - 1999 ← Did a simple print("Timeline: 1900 - 1999")

     Year Month
0    1900   Jan
1    1900   Feb
2    1900   Mar
3    1900   Apr
4    1900   May
..    ...   ...
1185  1999   Aug
1186  1999   Sep
1187  1999   Oct
1188  1999   Nov
1189  1999   Dec
 

Моя задача — создать пользовательский ввод, который выбирает начальный YY или YYMM и конечный YY или YYMM для нарезки строк, вот как я себе это представляю,

 start_time = input(YY/YYMM) e.g 1910 Jan
end_time = input(YY/YYMM) e.g 1930 Nov
Note: Again, I want user to also be able to enter just the year itself rather than both year and month e.g. 1911
 

Итак, как указано выше, вывод должен выглядеть примерно так,

 Timeline: YY/YYMM - YY/YYMM  ← Changes based on start_time amp; end_time

     Year Month
0    1910   Jan
1    1910   Feb
2    1910   Mar
3    1910   Apr
4    1910   May
..    ...   ...
231  1930   Nov
 

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

Ответ №1:

Это один из способов сделать это.

 import pandas as pd

# Inputs
start_time = input('Start Period: ') # 1900 Jan or 1900
end_time = input('End Period: ') # 1910 May or 1910

# If month is present
if len(start_time.split()) > 1:
    start_year, start_month = start_time.split()
# no start month
else:
    start_year = start_time
    start_month = 'Jan'
# If end month
if len(end_time.split()) > 1:
    end_year, end_month = end_time.split()

#no end month
else:
    end_year = end_time
    end_month = 'Dec'

months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']

df = pd.DataFrame(columns=['Month', 'Year']) # output dataframe

# Iterate between start and end year
for i in range(int(start_year), int(end_year) 1):
    temp_df = pd.DataFrame() #temporary dataframe
    if i == int(start_year):
        month_list = months[months.index(start_month):]
    elif i == int(end_year):
        month_list = months[:months.index(end_month) 1]
    else:
        month_list = months

    temp_df['Month'] = month_list
    temp_df['Year'] = i

    df = df.append(temp_df, ignore_index=True)
 

Комментарии:

1. Черт возьми! Поначалу это кажется довольно сложным, но со временем становится легче понять. Спасибо, чувак!

2. Однако у меня есть вопрос: как мне убедиться, что пользователь действительно помещает в соответствующий промежуток времени?

3. @JohnNg проходит в некоторых условиях, таких как время начала < время окончания. Если это то, что вы спрашиваете