劫持日期并检查是否在熊猫的日期范围之间

时间:2018-05-03 16:13:03

标签: python pandas date dataframe

如果日期属于日期字段中的日期,我如何查看日期属于哪个类别?我不能用merge_asof作为工作; pandas仅为v0.18。

d = {'buckets': ['1D', '1W', '1M'], 'dates': ['03-05-2018', '10-05-2018', '03-06-2018']}
date_buckets = pd.DataFrame(data=d)


    buckets dates
0   1D  03-05-2018
1   1W  10-05-2018
2   1M  03-06-2018

因此,例如,如果给定日期07-05-2018,我该如何返回1W?我需要为数百行执行此操作,因此需要高效。

感谢,

2 个答案:

答案 0 :(得分:1)

这是一种可以轻松扩展到更多匹配日期的方法:

scalar_date = pd.DataFrame(index=[pd.to_datetime("07-05-2018", format="%d-%m-%Y")])

scalar_date.join(date_buckets. \
                   set_index('dates'). \
                   reindex(pd.date_range(date_buckets.dates.min(), \
                                         date_buckets.dates.max()), \
                           method='bfill'))

#            buckets
# 2018-05-07      1W

此处的想法是调整date_buckets数据框的大小(使用.reindex method='bfill'),以便您可以轻松地将其与查找日期一起加入数据框。

答案 1 :(得分:1)

您可以使用pandas.cut进行分箱值:

import pandas as pd

d = {'buckets': ['1D', '1W', '1M'],
     'dates': ['03-05-2018', '10-05-2018', '03-06-2018']}
df_bin = pd.DataFrame(data=d)

df_bin['dates'] = pd.to_datetime(df_bin['dates'], dayfirst=True)\
                    .dt.strftime('%Y%m%d').astype(int)

df = pd.DataFrame({'date': ['07-05-2018']})
df['date'] = pd.to_datetime(df['date'], dayfirst=True)\
               .dt.strftime('%Y%m%d').astype(int)

df['Tenor'] = pd.cut(df['date'],
                     bins=df_bin['dates'],
                     labels=df_bin['buckets'].iloc[1:])

print(df)

       date Tenor
0  20180507    1W