Мне кажется, что лучшим инструментом для использования здесь является PeriodIndex
(для генерации месяцев и лет между датами).
Однако PeriodIndex может работать только с одной строкой за раз.Итак, если мы собираемся использовать PeriodIndex, каждая строка должна обрабатываться индивидуально.К сожалению, это означает циклическое перемещение по строкам DataFrame:
import pandas as pd
df = pd.DataFrame([('a1','b1','c1','1Jan1990','15Aug1990'),
('a3','b3','c3','11May1986','11May1986'),
('a5','b5','c5','1Dec1984','31Dec2017')],
columns=['A','B','C','Date1','Date2'])
result = []
for tup in df.itertuples():
index = pd.PeriodIndex(start=tup.Date1, end=tup.Date2, freq='M')
new_df = pd.DataFrame([(tup.A, tup.B, tup.C)], index=index)
new_df['Month'] = new_df.index.month
new_df['Year'] = new_df.index.year
result.append(new_df)
result = pd.concat(result, axis=0)
print(result)
приводит к
0 1 2 Month Year
1990-01 a1 b1 c1 1 1990 <--- Beginning of row 1
1990-02 a1 b1 c1 2 1990
1990-03 a1 b1 c1 3 1990
1990-04 a1 b1 c1 4 1990
1990-05 a1 b1 c1 5 1990
1990-06 a1 b1 c1 6 1990
1990-07 a1 b1 c1 7 1990
1990-08 a1 b1 c1 8 1990 <--- End of row 1
1986-05 a3 b3 c3 5 1986 <--- Beginning and End of row 2
1984-12 a5 b5 c5 12 1984 <--- Beginning row 3
1985-01 a5 b5 c5 1 1985
1985-02 a5 b5 c5 2 1985
1985-03 a5 b5 c5 3 1985
1985-04 a5 b5 c5 4 1985
... .. .. .. ... ...
2017-09 a5 b5 c5 9 2017
2017-10 a5 b5 c5 10 2017
2017-11 a5 b5 c5 11 2017
2017-12 a5 b5 c5 12 2017 <--- End of row 3
[406 rows x 5 columns]
Обратите внимание, что на самом деле вам не обязательно определять Month
и Year
столбцы
new_df['Month'] = new_df.index.month
new_df['Year'] = new_df.index.year
, поскольку у вас уже есть PeriodIndex, который упрощает вычисления месяцев и лет.