【问题标题】:Editing date list编辑日期列表
【发布时间】:2015-10-09 15:16:07
【问题描述】:

我有一个数据框,其中索引是日期。我想获取索引中的日期列表,但只能每 90 天获取一次。所以应该是[1999-01-01, 1999-04-01, 1999-07-01...] 等等。

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)

这只是给了我所有的日期,但移动了 90 天。我正在使用datetime.timedelta(),因为我的数据框缺少假期或周末等日期,所以我不能只调用数据框中的每个第 90 个单元格。

首先我只想获取列表,然后我将进行一个while循环以确保列表中的日期可以移动一到三天,以防它落在周末或节假日。

【问题讨论】:

  • 我认为您可以做的是获取第一个和最后一个索引结果并将其用作范围并将其传递给 pd.date_range(start, end, freq='90D') 或类似
  • 完美。谢谢!

标签: python pandas dataframe


【解决方案1】:

更有效的方法是使用date_range 使用索引中的第一个和最后一个值生成范围:

pd.date_range(start, end, freq='90D')

其中 start 和 end 分别是 df.index[0]df.index[-1]freq 参数接受一个频率值,这里是 90 天,适合您的要求。

这将比为每个值添加 90 天然后废弃大部分值要快得多。

【讨论】:

    【解决方案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')]
    

    【讨论】:

    • 这不起作用,因为 OP 在其索引中缺少日期,他们想要一个常规的阶梯范围,这就是我建议使用 date_range 的原因
    【解决方案3】:

    改进 EdChum 的答案:

    导致您的数据框缺少日期,

    中的所有日期
    pd.data_range(start, end, freq='90D')
    

    在您的索引中不是必需的,因此您应该:

    dates_series = df.index
    
    lst_dates = []
    for dates_90D in pd.data_range(start, end, freq='90D'):
        dates_in_index = dates_series[dates_series>=dates_90D].min()
        lst_dates.append(dates_in_index)
    

    同:

    lst_dates = [df.index[df.index>=dates_90D] for dates_90D in pd.data_range(start, end, freq='90D')]
    

    【讨论】:

    • 很好的答案,但它只会跳过不在原始索引中的日期。我最好获得一个单独的日期列表,如pd.data_range(start, end, freq='90D'),并设置一个函数,如果原始索引中缺少给定日期,它将增加几天。最后,我将每 90 到 95 天约会一次
    猜你喜欢
    • 2019-01-11
    • 1970-01-01
    • 2010-11-27
    • 2020-11-22
    • 2015-01-18
    • 2023-03-04
    • 2021-12-21
    • 2011-04-22
    • 1970-01-01
    相关资源
    最近更新 更多