Генерировать диапазоны дат в python на ежегодной основе? - PullRequest
2 голосов
/ 26 сентября 2019

У меня есть формулировка проблемы, в которой я хочу, чтобы пользователь вводил только месяц и год: - например, «Январь» и «2018 год».Теперь я хочу наиболее оптимизированный способ генерации диапазона дат в Python за весь этот год.В этом случае я должен получить список всех дат: -

          Date
1   2018-01-01
2   2018-01-02
3   2018-01-03
4   2018-01-04
5   2018-01-05
6   2018-01-06
7   2018-01-07
8   2018-01-08
9   2018-01-09
10  2018-01-10
11  2018-01-11
12  2018-01-12
13  2018-01-13
14  2018-01-14  till 2018-12-31

Ответы [ 3 ]

3 голосов
/ 26 сентября 2019

Используйте date_range с указанием времени начала и окончания:

m = 'Mar'
y = 2019

start = pd.to_datetime(f'{m}{y}', format='%b%Y')
end = pd.to_datetime(f'{m}{y + 1}', format='%b%Y')  - pd.Timedelta('1d')

df = pd.DataFrame({'Date': pd.date_range(start, end)})

print (df)
          Date
0   2019-03-01
1   2019-03-02
2   2019-03-03
3   2019-03-04
4   2019-03-05
..         ...
361 2020-02-25
362 2020-02-26
363 2020-02-27
364 2020-02-28
365 2020-02-29

[366 rows x 1 columns]

РЕДАКТИРОВАТЬ:

Для фильтра выходных дней по Series.dt.dayofweek:

df1 = df[df['Date'].dt.dayofweek > 4]
print (df1)
          Date
1   2019-03-02
2   2019-03-03
8   2019-03-09
9   2019-03-10
15  2019-03-16
..         ...
351 2020-02-15
352 2020-02-16
358 2020-02-22
359 2020-02-23
365 2020-02-29

[105 rows x 1 columns]
1 голос
/ 26 сентября 2019

Поскольку использование Timedelta для очень больших различий кажется неточным , вы также можете использовать DateOffset для расчета разницы дат:

import pandas as pd
import pandas.tseries.offsets as po

m = 'Mar'
y = 2019

start = pd.to_datetime(f'{m}{y}', format='%b%Y')
end = start + po.DateOffset(years=1) - po.DateOffset(days=1)

df = pd.DataFrame({'Date': pd.date_range(start, end)})
df
# Date
# 0 2019-03-01
# 1 2019-03-02
# 2 2019-03-03
# 3 2019-03-04
# 4 2019-03-05
# ...   ...
# 361   2020-02-25
# 362   2020-02-26
# 363   2020-02-27
# 364   2020-02-28
# 365   2020-02-29
# 366 rows × 1 columns
0 голосов
/ 26 сентября 2019

Просто сделайте следующее, pandas date_range сделает все остальное

year = 2019
month="jan"
pd.date_range(f"{year}-{month}-1", f"{year}-{12}-31")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...