python中日期范围之间的月份开始日期和结束日期

Posted

技术标签:

【中文标题】python中日期范围之间的月份开始日期和结束日期【英文标题】:month starting date and ending date between a range of date in python 【发布时间】:2020-06-10 09:17:25 【问题描述】:

输入是一个日期范围,我们需要在该范围内找到该月的开始日期和该月的结束日期之间的所有日期。示例如下

输入:

  start date: 2018-6-15
  end date: 2019-3-20

想要的输出:

[ 
  ["month starting date","month ending date"],
  ["2018-6-15","2018-6-30"],
  ["2018-7-1","2018-7-31"],
  ["2018-8-1","2018-8-31"],
  ["2018-9-1","2018-9-30"],
  ["2018-10-1","2018-10-31"],
  ["2018-11-1","2018-11-30"],
  ["2018-12-1","2018-12-31"],
  ["2019-1-1","2019-1-31"],
  ["2019-2-1","2019-2-28"],
  ["2019-3-1","2019-3-20"]
]

【问题讨论】:

到目前为止你有什么尝试? 【参考方案1】:

使用pandas 的选项:创建一个从开始到结束日期的date_range,从中提取月份数字作为pandas.Series,shift 向前1 个元素和向后1 个元素来检索布尔掩码,其中月份变化(!=)。现在,您可以根据需要创建一个 DataFrame 来使用或创建一个列表列表。

例如:

import pandas as pd

start_date, end_date = '2018-6-15', '2019-3-20'
dtrange = pd.date_range(start=start_date, end=end_date, freq='d')
months = pd.Series(dtrange .month)

starts, ends = months.ne(months.shift(1)), months.ne(months.shift(-1))
df = pd.DataFrame('month_starting_date': dtrange[starts].strftime('%Y-%m-%d'),
                   'month_ending_date': dtrange[ends].strftime('%Y-%m-%d'))
# df
#   month_starting_date month_ending_date
# 0          2018-06-15        2018-06-30
# 1          2018-07-01        2018-07-31
# 2          2018-08-01        2018-08-31
# 3          2018-09-01        2018-09-30
# 4          2018-10-01        2018-10-31
# 5          2018-11-01        2018-11-30
# 6          2018-12-01        2018-12-31
# 7          2019-01-01        2019-01-31
# 8          2019-02-01        2019-02-28
# 9          2019-03-01        2019-03-20

# as a list of lists:
l = [df.columns.values.tolist()] + df.values.tolist()
# l
# [['month_starting_date', 'month_ending_date'],
#  ['2018-06-15', '2018-06-30'],
#  ['2018-07-01', '2018-07-31'],
#  ['2018-08-01', '2018-08-31'],
#  ['2018-09-01', '2018-09-30'],
#  ['2018-10-01', '2018-10-31'],
#  ['2018-11-01', '2018-11-30'],
#  ['2018-12-01', '2018-12-31'],
#  ['2019-01-01', '2019-01-31'],
#  ['2019-02-01', '2019-02-28'],
#  ['2019-03-01', '2019-03-20']]

请注意,我在创建 DataFrame 时使用了strftime。如果您希望输出为 dtype 字符串,请执行此操作。如果您想继续使用日期时间对象(时间戳),请不要申请 strftime

【讨论】:

【参考方案2】:

这段代码很简单,使用标准的python包。

import calendar
from datetime import datetime, timedelta


def get_time_range_list(start_date, end_date):
    date_range_list = []
    while 1:
        month_end = start_date.replace(day=calendar.monthrange(start_date.year, start_date.month)[1])
        next_month_start = month_end + timedelta(days=1)
        if next_month_start <= end_date:
            date_range_list.append((start_date, month_end))
            start_date = next_month_start
        else:
            date_range_list.append((start_date, end_date))
            return date_range_list

【讨论】:

以上是关于python中日期范围之间的月份开始日期和结束日期的主要内容,如果未能解决你的问题,请参考以下文章

如何根据日期范围创建月份数组

php 获取开始日期与结束日期之间所有月份

Mondrain MDX 用于日期范围之间的记录,其中开始日期和结束日期是单独的列

根据开始日期和结束日期每月分配金额

两个日期之间的月份 | PostgreSQL

我需要根据用户在odoo中选择的月份来获取月份的开始日期和结束日期