gpt4 book ai didi

python - 查找缺失的日期

转载 作者:太空宇宙 更新时间:2023-11-03 21:14:29 25 4
gpt4 key购买 nike

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

这是我的场景:(数据按客户排序,然后按起始日期排序。 日期格式为: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

该函数应读取“起始日期”和“截止日期”,并查看日期(对于每个客户)是否连续。然后,添加一列(结果)并显示结果。

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

(已添加评论)

请看一下我的预期输出。我也添加了索引和一些解释:Index[1] 显示缺失是因为连续性被破坏,您可以通过比较 To date[0] 与 From date[2] 来得出此结论,这两个值不相同。另一方面:到日期[2]=从日期[4],这就是为什么“结果”显示不缺失[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

任何帮助将不胜感激。

最佳答案

使用pd.DataFrame.groupbypd.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是仅包含单个 Customer 的数据帧的子集的数据。 shift(1)提供向下移动 1 个单元格的数据帧。这是为了比较To DateFrom Date简单。
  • d['From Date'][dt.index] == dt :提供To Date之间比较的 bool 结果和From Date .
  • dt.iloc[i] = res[i] :一旦您拥有 list的 Missing 和 Not Missing 的,您将其分配回 dt制作Results列。
  • dfs.append(pd.concat([d, dt] 1)) : 连接新创建的Results原创栏目d ,和appendlist
  • result = pd.concat(dfs) :dfs现在包含每个 Customer 的子集数据帧。将它们连接成一个大数据帧。
  • result.columns = ['To Date', 'From Date', 'Results'] :重新分配列名称。

关于python - 查找缺失的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54818974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com