Python 如何将datetime系列中的每个日期与同一系列中最近的1年前的日期进行分组?

Python 如何将datetime系列中的每个日期与同一系列中最近的1年前的日期进行分组?,python,pandas,datetime,Python,Pandas,Datetime,I在数据帧内处理时间序列数据。datetime索引不完整(即缺少某些日期) 我想创建一个datetime系列偏移量为1年的新列,但只包含原始datetimeindex中存在的日期。挑战在于,在许多情况下,索引中不存在精确的1y匹配 Index (Input) 1 year offset (Output) 1/2/2014 None 1/3/2014 None 1/6/2014 None 1/7/2014 None 1/9/2014

I在数据帧内处理时间序列数据。datetime索引不完整(即缺少某些日期)

我想创建一个datetime系列偏移量为1年的新列,但只包含原始datetimeindex中存在的日期。挑战在于,在许多情况下,索引中不存在精确的1y匹配

Index (Input)   1 year offset (Output)
1/2/2014        None
1/3/2014        None
1/6/2014        None
1/7/2014        None
1/9/2014        None
1/10/2014       None
1/2/2015        1/2/2014
1/5/2015        1/3/2014
1/6/2015        1/6/2014
1/7/2015        1/7/2014
1/8/2015        1/9/2014
1/9/2015        1/10/2014
要求如下所示:

  • 截至2015年1月2日的每个日期必须有相应的抵销日期(无空格)
  • “抵销日期”组中的每个日期也必须出现在索引列中(即不需要引入新日期,如2014年1月8日)

  • 所有抵销日期必须按升序排列(日期顺序必须保留)

  • 我到目前为止所做的尝试

  • 这没有帮助,因为它对索引中不存在的日期不敏感
  • 方法
    data[“1年偏移量(输出)”]=data.Index.shift(365)
    没有帮助,因为索引中的日期数在不同年份中是不同的
  • 我现在要做的有几个步骤:

  • 首先应用方法创建“临时1年补偿”
  • 使用
    set(list)
    方法从“临时1年偏移量”中删除datetimeindex中不存在的单个日期,并用NaN替换单元格

  • 在datetimeindex中选择“临时1年偏移量”为NaN的日期,并减去一年

  • 使用
    argmin

  • 这里的挑战是,在某些情况下,我会得到两个条目以及天数的降序。这些条目会以以下方式影响结果(请参见第n天和第n+1天之间的时间差):

    在任何情况下,这最后一种方法似乎是对基本目标的简单性的过度关注。有没有更快更简单的方法来实现它

    如何将日期时间序列中的每个日期与同一序列中最近的一年前的日期进行分组?这是一种方法:

    但是,如果一年有366天,请查看此线程以正确处理1年:

    因此,该代码需要一些小的修改

    import pandas as pd
    import datetime
    
    df = pd.DataFrame(dict(dates=[
     '1/3/2014',
     '1/6/2014',
     '1/7/2014',
     '1/9/2014',
     '1/10/2014',
     '1/2/2015',
     '1/5/2015',
     '1/6/2015',
     '1/7/2015',
     '1/8/2015',
     '1/9/2015']))
    
    # Convert column to datetime
    df.dates = pd.to_datetime(df.dates)
    
    # Store min(year) as a variable
    minyear = min(df.dates).year
    
    # Calculate the day with timedelta -365 days (might fail on 2012?)
    df['offset'] = [(i + datetime.timedelta(days=-365)).date()
                    if i.year != minyear else None for i in df.dates]
    
    df
    
    返回:

            dates      offset
    0  2014-01-03        None
    1  2014-01-06        None
    2  2014-01-07        None
    3  2014-01-09        None
    4  2014-01-10        None
    5  2015-01-02  2014-01-02
    6  2015-01-05  2014-01-05
    7  2015-01-06  2014-01-06
    8  2015-01-07  2014-01-07
    9  2015-01-08  2014-01-08
    10 2015-01-09  2014-01-09
    

    非常感谢你的回答-列表理解对我来说是新的-你能少一点简约主义吗?+1解释你的方法。这并不能解决问题。在你上面的例子中,“偏移量”-column2输出包含6个日期。但其中只有3个日期也出现在column1中。我需要的东西只能在column 1中出现的完整日期组中为column2选择一个偏移日期。很抱歉,我不够精确,我相应地调整了问题。@sudonym yep这使事情变得更复杂。不幸的是,我需要工作我暂时不知道该怎么办,也帮不上你的忙。再仔细阅读你的问题,我的回答毫无意义:/
            dates      offset
    0  2014-01-03        None
    1  2014-01-06        None
    2  2014-01-07        None
    3  2014-01-09        None
    4  2014-01-10        None
    5  2015-01-02  2014-01-02
    6  2015-01-05  2014-01-05
    7  2015-01-06  2014-01-06
    8  2015-01-07  2014-01-07
    9  2015-01-08  2014-01-08
    10 2015-01-09  2014-01-09