编辑日期列表

时间:2015-10-09 15:16:07

标签: python pandas dataframe

我有一个数据框,索引是日期。我想获取索引中的日期列表,但每隔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循环以确保列表中的日期可以移动一到三天,以防它在周末或假日。

2 个答案:

答案 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')]