python - 查找缺失的日期
问题描述
我正在尝试编写一个可以在数据框中找到丢失日期的函数。
这是我的场景:(数据按客户排序,然后按日期排序。日期格式为: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
任何帮助将不胜感激。
解决方案
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 数据的数据帧的子集Customer
。shift(1)
提供数据帧在下面移动了 1 个单元格。这是为了便于To Date
比较。From Date
d['From Date'][dt.index] == dt
To Date
: 提供和之间比较的布尔结果From Date
。dt.iloc[i] = res[i]
:一旦你有一个list
Missing'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']
: 重新分配列名。
推荐阅读
- sql - SQL 查询以获取按天分组的过去 7 天内插入的记录
- wordpress - 试图翻译创世纪样本儿童主题?
- javascript - 拒绝展示
在一个框架中,因为它将“X-Frame-Options”设置为“拒绝” - python - 只知道其中的一部分来获得完整的单词
- docker - 过去 Docker 是如何生成容器名称的?
- api - 获取 Yii2 中 extraFields 的所有属性
- r - 带有 JSON 字符串的 R 数据框列 - 需要制作 JSON 对象列
- docker - 从主机访问 Docker 服务
- css - 在 css Angular 9 中使用管道
- c# - 如何使用 Swashbuckle 在 Swagger 中将复杂对象作为查询字符串传递