Получить все даты в формате ММ ГГГГ между двумя датами
Есть таблица, столбец с начальной датой и столбец с конечной датой, оба столбца в формате месяц.год (09.2022), нужно в третий столбец "период" записать все даты между этими двумя (начальной и конечной) соответственно в формате месяц.год. У меня именно с месяцем не получается сделать.
Вот файл. введите сюда описание ссылки
Пыталась сделать что-то аналогичное по дням, вроде получилось, но конечный формат не получается перевести в день месяц год.
df1 = pd.DataFrame({'sdate':['22-03-2019', '30-03-2019'], 'edate':['07-04-2019', '08-04-2019']})
#создание столбца days
df1.loc[:, "days"] = df1.apply(
lambda x: list(
pd.date_range(
x.sdate,
x.edate
).date
),
axis = 1
)
# вывод объекта DataFrame
df1
sdate edate days
0 22-03-2019 07-04-2019 [2019-03-22, 2019-03-23, 2019-03-24, 2019-03-2...
1 30-03-2019 08-04-2019 [2019-03-30, 2019-03-31, 2019-04-01, 2019-04-0..
Полученный столбец с датами не могу перевести в формат хотя бы 22-03-2019.
Ответы (1 шт):
Вам не надо переводить полученный столбец в другой формат - он у вас как раз в формате datetime pandas. у вас исходные столбцы в неверном формате (в виде строк). если вы сделаете так, то все сами поймете:
df["нач дат"] = pd.to_datetime(df["нач дат"], format="%m.%Y")
df["кон дат"] = pd.to_datetime(df["кон дат"], format="%m.%Y")
df["период"] = df.apply(lambda x: pd.date_range(x["нач дат"], x["кон дат"], freq="MS").date, axis=1)
нач дат кон дат период
0 2019-07-01 2021-05-01 [2019-07-01, 2019-08-01, 2019-09-01, 2019-10-0...
1 2021-09-01 2021-12-01 [2021-09-01, 2021-10-01, 2021-11-01, 2021-12-01]
2 2019-01-01 2021-04-01 [2019-01-01, 2019-02-01, 2019-03-01, 2019-04-0...
3 2019-01-01 2022-01-01 [2019-01-01, 2019-02-01, 2019-03-01, 2019-04-0...
4 2019-01-01 2020-06-01 [2019-01-01, 2019-02-01, 2019-03-01, 2019-04-0...
5 2019-01-01 2022-06-01 [2019-01-01, 2019-02-01, 2019-03-01, 2019-04-0...
6 2019-01-01 2022-06-01 [2019-01-01, 2019-02-01, 2019-03-01, 2019-04-0...
и т. д.
как видите, я добавил частоту в метод to_datetime - тогда у вас в списке будет только по одному объекту за каждый месяц.
Для отображения периода именно в строковом формате "месяц-год", можно еще добавить:
df["период"] = df["период"].apply(lambda x: list(map(lambda y: f"{y[0]}-{y[1]}", zip(x.month, x.year))))
получим:
нач дат кон дат период
0 2019-07-01 2021-05-01 [7-2019, 8-2019, 9-2019, 10-2019, 11-2019, 12-...
1 2021-09-01 2021-12-01 [9-2021, 10-2021, 11-2021, 12-2021]
2 2019-01-01 2021-04-01 [1-2019, 2-2019, 3-2019, 4-2019, 5-2019, 6-201...
3 2019-01-01 2022-01-01 [1-2019, 2-2019, 3-2019, 4-2019, 5-2019, 6-201...
4 2019-01-01 2020-06-01 [1-2019, 2-2019, 3-2019, 4-2019, 5-2019, 6-201...
5 2019-01-01 2022-06-01 [1-2019, 2-2019, 3-2019, 4-2019, 5-2019, 6-201...
6 2019-01-01 2022-06-01 [1-2019, 2-2019, 3-2019, 4-2019, 5-2019, 6-201...
7 2019-01-01 2021-10-01 [1-2019, 2-2019, 3-2019, 4-2019, 5-2019, 6-201...