我有一个数据框,索引是日期。我想获取索引中的日期列表,但每隔90天才能获得。所以它会是df #is my dataframe
date_list = df.index.tolist()
new_list=[]
for date in date_list:
new_date = date +datetime.timedelta(days=90)
new_list.append(new_date)
等等。
datetime.timedelta()
这只是给了我所有日期,但移动了90天。我正在使用{{1}},因为我的数据框缺少假期或周末等日期,所以我不能只从数据框中调用每个第90个单元格。
首先我只想获取列表,然后我将进行一个while循环以确保列表中的日期可以移动一到三天,以防它在周末或假日。
答案 0 :(得分:2)
更有效的方法是使用date_range
使用索引中的第一个和最后一个值生成范围:
pd.date_range(start, end, freq='90D')
开头和结尾分别为df.index[0]
和df.index[-1]
,freq
参数接受的频率值为90天,符合您的要求。
这比为每个值添加90天然后废弃其中的大部分要快得多。
答案 1 :(得分:2)
假设您已经有一个日期列表,那么您是否只能使用一个步幅?
date_list = pd.date_range('2015-01-01', periods=365)
>>> date_list[::90]
DatetimeIndex(['2015-01-01', '2015-04-01', '2015-06-30', '2015-09-28',
'2015-12-27'],
dtype='datetime64[ns]', freq='90D', tz=None)
鉴于日期在您的索引中,您可以执行以下操作:
new_dates = df.index[::90]
修改强>
鉴于您的初始日期有周末和假日,并且您希望您的间隔为90天,您可以使用asof
获取截至第90天的最新值:
# An index based on M-F weekdays.
weekdays = pd.Index([d for d in pd.date_range('2015-01-01', periods=365)
if d.weekday() < 5])
new_dates = [weekdays.asof(d) for d in pd.date_range('2015-01-01', '2015-12-31', freq='90D')]
>>> new_dates
[Timestamp('2015-01-01 00:00:00'),
Timestamp('2015-04-01 00:00:00'),
Timestamp('2015-06-30 00:00:00'),
Timestamp('2015-09-28 00:00:00'),
Timestamp('2015-12-25 00:00:00')]