Python 编辑日期列表
我有一个数据框,索引是日期。我想得到索引中的日期列表,但只能每隔90天一次。所以应该是[1999-01-01,1999-04-01,1999-07-01…]等等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) 这只给了
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