我有开始日期和结束日期。我需要在这两个日期之间得到所有日期。还有一个条件是它应该根据分割方式返回日期,即它可以是周基础,日基础,小时基础,月基础
我检查了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'
----------等等
答案 0 :(得分:2)
以下是使用自定义weekmask
:
>>> 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之间所有日期的列表
按周划分它很容易,我把它留给你,如果你遇到其他类型的分裂问题,请发一个跟进问题,但它很直接