Итерация в начале / конце календарного месяца - PullRequest
1 голос
/ 17 июня 2019

Я хотел бы создать цикл, который будет возвращаться для каждого месяца в течение предоставленного периода времени, первого дня и последнего дня (принимая во внимание, что месяцы заканчиваются 28–31-го дня): («function_to_increase_month» еще не определено )

for beg in pd.date_range('2014-01-01', '2014-06-30', freq='1M'):
period_start = beg
period_end = function_to_increase_month(beg)

Ожидаемый результат для первой итерации: period_start = '2014-01-01' period_end = '2014-01-31'

Вторая итерация: period_start = '2014-02-01' period_end = '2014-02-28'

Третья итерация: period_start = '2014-03-01' period_end = '2014-03-31'

Кто-нибудь может предложить подход?

Ответы [ 4 ]

2 голосов
/ 17 июня 2019

Хорошо, вот моя реализация вашей проблемы:

import calendar

year = 2014

for i in range(1,7):
    start_date = f'{year}-0{i}-01'
    end_date = calendar.monthrange(year, {i})[1]
2 голосов
/ 17 июня 2019

Использование pandas.tseries.offsets.MonthEnd

Ex:

from pandas.tseries.offsets import MonthEnd

for beg in pd.date_range('2014-01-01', '2014-06-30', freq='MS'):
    print(beg.strftime("%Y-%m-%d"), (beg + MonthEnd(1)).strftime("%Y-%m-%d"))

Выход:

2014-01-01 2014-01-31
2014-02-01 2014-02-28
2014-03-01 2014-03-31
2014-04-01 2014-04-30
2014-05-01 2014-05-31
2014-06-01 2014-06-30
1 голос
/ 17 июня 2019

Мы можем сделать это, используя комбинацию datetime и календарь модулей в python

def get_start_end_dates(from_date, to_date):
  # Convert string to datetime objects
  from_date = datetime.datetime.strptime(from_date, '%Y-%m-%d')
  to_date = datetime.datetime.strptime(to_date, '%Y-%m-%d')

  # The beginning day is always 1
  beg_date = datetime.datetime(from_date.year, from_date.month, 1)

  # Iterate till the beginning date is less the to date
  while beg_date <= to_date:
    # Get the number of days in that month in that year
    n_days_in_that_month = calendar.monthrange(beg_date.year, beg_date.month)[1]

    # Get end date using n_days_in_that_month
    end_date = datetime.datetime(beg_date.year, beg_date.month, n_days_in_that_month)

    # Yield the beg_date and end_date
    yield (beg_date.date(), end_date.date())

    # Next month's first day will be end_date + 1 day
    beg_date = end_date + datetime.timedelta(days=1)

for period_start, period_end in get_start_end_dates('2018-02-01', '2019-01-01'):
    print ('period_start: {}'.format(period_start), 'period_end: {}'.format(period_end))

Результат для приведенного выше кода выглядит следующим образом.

period_start: 2018-02-01 period_end: 2018-02-28
period_start: 2018-03-01 period_end: 2018-03-31
period_start: 2018-04-01 period_end: 2018-04-30
period_start: 2018-05-01 period_end: 2018-05-31
period_start: 2018-06-01 period_end: 2018-06-30
period_start: 2018-07-01 period_end: 2018-07-31
period_start: 2018-08-01 period_end: 2018-08-31
period_start: 2018-09-01 period_end: 2018-09-30
period_start: 2018-10-01 period_end: 2018-10-31
period_start: 2018-11-01 period_end: 2018-11-30
period_start: 2018-12-01 period_end: 2018-12-31
period_start: 2019-01-01 period_end: 2019-01-31

Надеюсь, это поможет!

1 голос
/ 17 июня 2019

Будет ли это работать?

for i in range(1, 7):  # 1 through 6 inclusive
        period_start = f'2014-0{i}-01'
        period_end = (datetime.date(2014, i+1, 1) - datetime.timedelta(days=1)).strftime('%Y-%m-%d')

Вместо использования pandas диапазонов дат, просто вставляется i в поле month для period_start. Получить последний день месяца для period_end немного сложнее, но одним из обходных путей является получение первого дня следующего месяца , следующего за , а затем вычитание одного дня из него. Здесь я использую datetime для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...