熊猫-计算另一个日期介于哪个日期之间

时间:2020-09-08 21:11:33

标签: python pandas date

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

date1 date2 date3 date4 date5 date_var result1 result2
jan1  feb1  apr1  sep1  dec1  mar1     apr1    feb1

因此,基本上,目标是找出date_var在两个日期之间(在此处为feb-apr),然后拉出较小或较大的两个日期。如果很重要,则已清除输入数据,以便所有日期的date1

我的解决方法是:

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
...

但这很慢。有没有一种更快的方法可以执行此操作,或者这只是很慢的事情?谢谢。

1 个答案:

答案 0 :(得分:1)

这是我对问题的理解。

  • 我们给了5个日期,使d1
  • 我们还获得了目标日期。
  • 找到我,使d_i <=目标
  • result1是d_i,而result2是d_i + 1

这是我的方法:

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