首页 > 解决方案 > 查找缺失的日期

问题描述

我正在尝试编写一个可以在数据框中找到丢失日期的函数。

这是我的场景:(数据按客户排序,然后按日期排序。日期格式为:M/D/Y)

From Date   To Date
Customer        
A   1/10/2017   2/9/2017
A   NaN         NaN
A   3/10/2017   4/9/2017
A   NaN         NaN
A   4/9/2017    5/9/2017
B   2/10/2017   3/9/2017
B   NaN         NaN
B   3/9/2017    4/9/2017

该函数应读取 From Date 和 To Date 并查看日期是否有连续性(对于每个客户)。然后,添加一列(Results)并显示结果。

该函数必须对每个客户进行迭代。

(添加评论)

请看看我的预期输出。我也在添加索引和一些解释: Index[1] 由于连续性被破坏而显示缺失,您可以通过比较 To date[0] 与 From date[2] 得出这个结论,这两个值不一样。另一方面:To date[2]= From date[4] 这就是“结果”显示 Not Missing[3] 的原因。

Customer From date  To date Results
0   A   1/10/2017   2/9/2017    NaN
1   A   NaN         NaN         Missing
2   A   3/10/2017   4/9/2017    NaN
3   A   NaN         NaN         Not Missing
4   A   4/9/2017    5/9/2017    NaN
5   B   2/10/2017   3/9/2017    NaN
6   B   NaN         NaN         Not Missing
7   B   3/9/2017    4/9/2017    NaN

任何帮助将不胜感激。

标签: pythontime-series

解决方案


pd.DataFrame.groupby与 一起使用pd.to_datetime

df['From Date'] = pd.to_datetime(df['From Date'], format="%m/%d/%Y")
df['To Date'] = pd.to_datetime(df['To Date'], format="%m/%d/%Y")

dfs = []
for k, d in df.groupby('Customer'):
    dt = d.dropna()['To Date'].shift(1)[1:]
    res = []
    for i in range(dt.shape[0]):
        if (d['From Date'][dt.index] == dt).iloc[i]:
            res.append('Not Missing')
        else:
            res.append('Missing')
    for i in range(dt.shape[0]):
        dt.iloc[i] = res[i]
    dt.index -= 1
    dfs.append(pd.concat([d, dt], 1))
result = pd.concat(dfs)
print(result)

  Customer  From Date    To Date      To Date
0        A 2017-01-10 2017-02-09          NaN
1        A        NaT        NaT      Missing
2        A 2017-03-10 2017-04-09          NaN
3        A        NaT        NaT  Not Missing
4        A 2017-04-09 2017-05-09          NaN
5        B 2017-02-10 2017-03-09          NaN
6        B        NaT        NaT  Not Missing
7        B 2017-03-09 2017-04-09          NaN

最后:

df.columns = ['From Date', 'To Date', 'Results']
print(df)

  Customer  From Date    To Date      Results
0        A 2017-01-10 2017-02-09          NaN
1        A        NaT        NaT      Missing
2        A 2017-03-10 2017-04-09          NaN
3        A        NaT        NaT  Not Missing
4        A 2017-04-09 2017-05-09          NaN
5        B 2017-02-10 2017-03-09          NaN
6        B        NaT        NaT  Not Missing
7        B 2017-03-09 2017-04-09          NaN

说明:

  • pd.to_datetime:这是为了将您看起来像日期的数据转换为实际的日期时间数据。这样,pandas可以做一些计算(例如diff两天之间)。由于它是串行操作,因此必须在每个所需的列上而不是在整个数据帧上完成。
  • df.groupby:groupby返回一个以给定条件为键的类字典对象。由于要对每个 Customer进行整个计算,因此使用了 `df.groupby('Customer')。
  • dt = d.dropna()['To Date'].shift(1)[1:]:d是仅包含 single 数据的数据帧的子集Customershift(1)提供数据帧在下面移动了 1 个单元格。这是为了便于To Date比较。From Date
  • d['From Date'][dt.index] == dtTo Date: 提供和之间比较的布尔结果From Date
  • dt.iloc[i] = res[i]:一旦你有一个listMissing's 和 Not Missing's,你将它分配回dt以制作Results列。
  • dfs.append(pd.concat([d, dt] 1)): 将新创建的Results列与 original连接起来d,并将append其连接到list
  • result = pd.concat(dfs)dfs现在包含每个Customer. 将它们连接成一个大数据框。
  • result.columns = ['To Date', 'From Date', 'Results']: 重新分配列名。

推荐阅读