Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 编辑日期列表_Python_Pandas_Dataframe - Fatal编程技术网

Python 编辑日期列表

Python 编辑日期列表,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据框,索引是日期。我想得到索引中的日期列表,但只能每隔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天一次。所以应该是[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循环,以确保列表中的日期可以移动一到三天,以防它落在周末或假日。

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

如果开始和结束分别是df.index[0]和df.index[-1],则freq参数接受一个频率值,此处为90天,适合您的要求


这比在每个值上增加90天,然后取消其中的大部分要快得多。

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

如果开始和结束分别是df.index[0]和df.index[-1],则freq参数接受一个频率值,此处为90天,适合您的要求


这将比在每个价值上增加90天,然后取消大部分价值要快得多。

要改进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')]

要改进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')]

假设你已经有了一个日期列表,你就不能用步幅吗

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

假设你已经有了一个日期列表,你就不能用步幅吗

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

我想你可以做的是把第一个和最后一个索引结果作为一个范围,并将其传递给pd。日期\范围开始、结束、频率='90D'或类似的方法是完美的。非常感谢。我想你可以做的是把第一个和最后一个索引结果作为一个范围,并将其传递给pd。日期\范围开始、结束、频率='90D'或类似的方法是完美的。非常感谢。答案很好,但它只会跳过原始索引中没有的日期。我最好得到一个单独的日期列表,如pd.data\u rangestart,end,freq='90D',并设置一个函数,如果原始索引中缺少某个日期,则该函数将为该日期添加几天。最后,我会每隔90到95天得到一个日期一个好答案,但它只会跳过原始索引中没有的日期。我最好得到一个单独的日期列表,如pd.data\u rangestart,end,freq='90D',并设置一个函数,如果原始索引中缺少某个日期,则该函数将为该日期添加几天。最后,我将每隔90到95天得到一个日期,这不起作用,因为OP的索引中缺少日期,他们需要一个常规的阶梯范围,这就是为什么我建议使用date_range,这不起作用,因为OP的索引中缺少日期,他们需要一个常规的阶梯范围,这就是为什么我建议使用date_range