Pandas DataFrame,计算到下一个指定日期还剩多少天?

时间:2018-08-23 08:24:27

标签: python python-3.x pandas

我目前有一个看起来像这样的pandas DataFrame:

              Data
2018-07-02    15.60
2018-07-03    16.14
2018-07-09    12.69
2018-07-17    12.06
2018-07-19    12.87
2018-07-27    13.03
2018-08-01    13.15
2018-08-02    12.19
2018-08-07    10.93
2018-08-09    11.27
2018-08-10    13.16
2018-08-16    13.45
2018-08-17    12.64
2018-08-20    12.49
2018-08-21    12.86
2018-08-22    12.25

我还有日期列表:

dates = [datetime.datetime(2018, 8, 20, 0, 0),
         datetime.datetime(2018, 8, 1, 0, 0),
         datetime.datetime(2018, 7, 2, 0, 0)]

我想在我的DataFrame中添加另一列,称为“ Count”。它从日期列表中的最新日期开始计数,并在DataFrame中的datetimeindex与列表中的下一个日期匹配时将其重置。最终结果应如下所示:

              Data     Count     
2018-07-02    15.60    1
2018-07-03    16.14    6 
2018-07-09    12.69    5
2018-07-17    12.06    4
2018-07-19    12.87    3
2018-07-27    13.03    2
2018-08-01    13.15    1
2018-08-02    12.19    7
2018-08-07    10.93    6
2018-08-09    11.27    5
2018-08-10    13.16    4
2018-08-16    13.45    3
2018-08-17    12.64    2 
2018-08-20    12.49    1

在大型DataFrame上最有效的方法是什么?

2 个答案:

答案 0 :(得分:2)

使用GroupBy.cumcountisin创建的助手Series的{​​{3}},并为交换顺序添加[::-1]

s = pd.Series(df.index.isin(dates), index=df.index)[::-1].cumsum()
df['Count'] = df.groupby(s).cumcount(ascending=False) + 1
print (df)
             Data  Count
2018-07-02  15.60      1
2018-07-03  16.14      6
2018-07-09  12.69      5
2018-07-17  12.06      4
2018-07-19  12.87      3
2018-07-27  13.03      2
2018-08-01  13.15      1
2018-08-02  12.19      7
2018-08-07  10.93      6
2018-08-09  11.27      5
2018-08-10  13.16      4
2018-08-16  13.45      3
2018-08-17  12.64      2
2018-08-20  12.49      1

答案 1 :(得分:0)

编写一个函数,该函数查找DateTimeIndex和日期列表之间的时间事件的最小差异。在数据框的索引上应用apply映射以获得新列。

您可以根据需要以适当的方式使用以下代码。

def time_diff(i):
    dates = [datetime.datetime(2018, 8, 20, 0, 0),
             datetime.datetime(2018, 8, 1, 0, 0),
             datetime.datetime(2018, 7, 2, 0, 0)]
    diff_values = [ j - i for j in dates if j - i[0] != '-']
    if len(diff_values) > 0:
        return min(diff_values)

dataframe["Count"] = dataframe.index.map(time_diff)