Python 熊猫-计算其他日期之间的日期

Python 熊猫-计算其他日期之间的日期,python,pandas,date,Python,Pandas,Date,我有一个数据集,其中每个记录有5个日期值,然后是另一个日期变量。我想取5个日期中最小的一个大于另一个变量,或者取5个日期中最大的一个小于另一个变量。例如: date1 date2 date3 date4 date5 date_var result1 result2 jan1 feb1 apr1 sep1 dec1 mar1 apr1 feb1 所以基本上,我们的目标是找出两个日期中的哪一个(这里是2月-4月),然后取较小或较大的一个。如果重要,则输入数据已被清除,使得所

我有一个数据集,其中每个记录有5个日期值,然后是另一个日期变量。我想取5个日期中最小的一个大于另一个变量,或者取5个日期中最大的一个小于另一个变量。例如:

date1 date2 date3 date4 date5 date_var result1 result2
jan1  feb1  apr1  sep1  dec1  mar1     apr1    feb1
所以基本上,我们的目标是找出两个日期中的哪一个(这里是2月-4月),然后取较小或较大的一个。如果重要,则输入数据已被清除,使得所有日期的日期1 我的解决办法是:

df.loc[df.date_var > date5,'result2'] = date5
df.loc[(df.date_var <= date5) & (df.date_var > date4),'result2'] = date4
df.loc[(df.date_var <= date4) & (df.date_var > date3),'result2'] = date3
...
df.loc[df.date\u var>date5,'result2']=date5
df.loc[(df.date\u var date4),'result2']=date4
df.loc[(df.date\u var date3),'result2']=date3
...

但这是非常缓慢的。有没有更快的方法来完成这个操作,或者这只是一个缓慢的过程?谢谢。

这是我对这个问题的理解

  • 我们有5个日期,d1
  • 我们还得到了一个目标日期

  • 我发现d_i可以请你澄清这个例子的结果是什么?对于您的示例,我看不出是否有任何天数介于result1和result2之间。这里的答案是NA吗?result1和result2是函数的输出,您可以在示例中看到date_var介于date2和date3之间,因此这些结果只是这些列的值:feb1和apr1。我明白了。为什么不提取not na日期,并将日期的+1索引作为结果1返回,将-1索引作为结果2返回(假设对日期进行了排序,如果不对日期进行排序并删除na值,则执行此操作。)我不明白,您可以将要使用的代码放在下面吗?结果将取决于两个日期之间的日期,所以我试图找出如何进行比较。是的,这正是我想要的,谢谢。寻找较小的最大值或较大的最小值,这应该比检查4个间隔中的每一个来确定它属于哪一个要快得多。谢谢
    from collections import namedtuple
    import pandas as pd
    
    # create sample data
    Record = namedtuple('Record', 'd1 d2 d3 d4 d5 target')
    
    df = pd.DataFrame([
        Record('2019-01-01', '2019-02-01', '2019-04-01', '2019-09-01', '2019-12-01', '2019-03-01'),
        Record('2020-01-01', '2020-02-01', '2020-04-01', '2020-09-01', '2020-12-01', '2020-03-01'),
    ])
    df = df.astype('datetime64[D]')
    
    # define function to find lower, upper bounding dates
    def find_bound(s, target, metric='min'):
        assert isinstance(s, pd.Series)
        
        if metric == 'min':
            return s[s <= target].max()
        else:
            return s[s > target].min()
    
    df['min'] = df.apply(lambda x: find_bound(x['d1':'d5'], x['target'], 'min'), axis=1)
    df['max'] = df.apply(lambda x: find_bound(x['d1':'d5'], x['target'], 'max'), axis=1)
    
    # verify that lower, upper bounds are correct
    df['validate'] = (df['min'] <= df['target']) & (df['target'] < df['max'])
    print(df.transpose())
    
                       0           1
    d1        2019-01-01  2020-01-01
    d2        2019-02-01  2020-02-01
    d3        2019-04-01  2020-04-01
    d4        2019-09-01  2020-09-01
    d5        2019-12-01  2020-12-01
    target    2019-03-01  2020-03-01
    min       2019-02-01  2020-02-01 <- result 1
    max       2019-04-01  2020-04-01 <- result 2
    validate        True        True