如何获取两个日期之间的日期

时间:2018-03-28 10:48:30

标签: python python-3.x pandas

我有开始日期和结束日期。我需要在这两个日期之间得到所有日期。还有一个条件是它应该根据分割方式返回日期,即它可以是周基础,日基础,小时基础,月基础

我检查了pandas date_range函数,但它只返回所有日期系列的结尾。

time_range = pandas.date_range(start_date, end_date, freq='W')

这仅返回每周的开始(开始日期),而不是结束周(end_date)。

示例:

time_range = pandas.date_range('2018-01-01 00:00:00', '2018-03-23 00:00:00', freq='W')

Result:
['2018-01-06 00:00:00Z', '2018-01-13 00:00:00Z', '2018-01-20 00:00:00Z', '2018-01-27 00:00:00Z', '2018-02-03 00:00:00Z', '2018-02-10 00:00:00Z', '2018-02-17 00:00:00Z', '2018-02-24 00:
00:00Z', '2018-03-03 00:00:00Z', '2018-03-10 00:00:00Z', '2018-03-17 00:00:00Z']

我需要开始日期和一周结束,即在这种情况下

'2018-01-01 00:00:00Z' - '2018-01-06 00:00:00Z'
'2018-01-07 00:00:00Z' - '2018-01-13 00:00:00Z'
'2018-01-14 00:00:00Z' - '2018-01-20 00:00:00Z'
'2018-01-21 00:00:00Z' - '2018-01-27 00:00:00Z'
'2018-02-28 00:00:00Z' - '2018-02-03 00:00:00Z'

----------等等

5 个答案:

答案 0 :(得分:2)

以下是使用自定义weekmask

进行“业务”日过滤的numpy解决方案
>>> all_days = np.arange('1970-02-05', '1970-05-08', dtype='M8[D]')
>>> week_start_end = all_days[np.is_busday(all_days, weekmask='Mon Sun')]
>>> week_start_end
array(['1970-02-08', '1970-02-09', '1970-02-15', '1970-02-16',
       '1970-02-22', '1970-02-23', '1970-03-01', '1970-03-02',
       '1970-03-08', '1970-03-09', '1970-03-15', '1970-03-16',
       '1970-03-22', '1970-03-23', '1970-03-29', '1970-03-30',
       '1970-04-05', '1970-04-06', '1970-04-12', '1970-04-13',
       '1970-04-19', '1970-04-20', '1970-04-26', '1970-04-27',
       '1970-05-03', '1970-05-04'], dtype='datetime64[D]')

这只能持续数周。对于其他单位:

>>> def first_last_range(start, stop, step='M', resolution='D'):
...     large = np.arange(start, stop, dtype=f'M8[{step}]')
...     first = large.astype(f'M8[{resolution}]')
...     last = (large + np.timedelta64(1, step)).astype(f'M8[{resolution}]') - np.timedelta64(1, resolution)
...     full = np.c_[first, last].ravel()
...     return full[full[0] < np.datetime64(start) : len(full) - (full[-1] > np.datetime64(stop))]
... 
>>> 
>>> first_last_range('1970-02-05', '1970-05-08')
array(['1970-02-28', '1970-03-01', '1970-03-31', '1970-04-01',
       '1970-04-30'], dtype='datetime64[D]')

请注意,您可能希望根据需要调整终点语义。

答案 1 :(得分:1)

这可能是你想要的:

import itertools

start_end = [pd.date_range(start_date, end_date, freq='W-MON').tolist(), pd.date_range(start_date, end_date, freq='W-SUN').tolist()]

date_range = pd.DatetimeIndex(itertools.chain.from_iterable(start_end))

答案 2 :(得分:1)

您可以使用pandas.Timedelta和矢量化操作,并执行以下操作:

import pandas

start_dates = pandas.date_range("2018-01-01", "2018-03-23", freq="W")
end_dates = start_dates + pandas.Timedelta(weeks=1)

starts_list = start_dates.astype(str).tolist()
ends_list = end_dates.astype(str).tolist()

print(list(zip(starts_list, ends_list)))

如果start日期是您一周的开始,您将获得每周的第一天和最后一天。通过编辑Timedelta的参数和freq的{​​{1}}参数,您可以轻松调整其行为,例如在一个月内执行相同操作。

答案 3 :(得分:0)

你得到了什么结果?你期待什么结果?

这似乎对我有用:

ngOnInit() {
    this.Info.getCustomers().subscribe(data => {
      this.dataSource = new MatTableDataSource(data);
    });
    // Define filter function to look for 'premiseId'matches
    this.dataSource.filterPredicate = function(data, filter): boolean {
      return data.premiseId.toLowerCase().includes(filter);
    };
  }

答案 4 :(得分:0)

您可以通过查看timedelta

来获取日期列表
from datetime import date, datetime, timedelta
d0=datetime.strptime("2018-01-01","%Y-%m-%d")
d1= datetime.strptime("2018-02-01", "%Y-%m-%d")
l=[]
for days in range((d1-d0).days):
    l.append(str((d0 + timedelta(days)).date()))

现在l是d0和d1之间所有日期的列表 按周划分它很容易,我把它留给你,如果你遇到其他类型的分裂问题,请发一个跟进问题,但它很直接