Python 查找丢失的日期
我正在尝试编写一个函数,可以在数据帧中查找丢失的日期 这是我的设想: (数据按客户排序,然后按起始日期排序。 日期格式为:M/D/Y) 函数应继续读取From Date和To Date,并查看日期(对于每个客户)是否具有连续性。然后,添加一列(结果)并显示结果 该函数必须对每个客户进行迭代 (添加评论) 请看一下我的预期产出。我正在添加索引和一些解释: 索引[1]显示缺失,因为连续性被破坏,您可以通过比较日期[0]与日期[2]得出此结论,这两个值不相同。另一方面:截至日期[2]=自日期[4]这就是为什么“结果”显示未缺失[3]Python 查找丢失的日期,python,time-series,Python,Time Series,我正在尝试编写一个函数,可以在数据帧中查找丢失的日期 这是我的设想: (数据按客户排序,然后按起始日期排序。 日期格式为:M/D/Y) 函数应继续读取From Date和To Date,并查看日期(对于每个客户)是否具有连续性。然后,添加一列(结果)并显示结果 该函数必须对每个客户进行迭代 (添加评论) 请看一下我的预期产出。我正在添加索引和一些解释: 索引[1]显示缺失,因为连续性被破坏,您可以通过比较日期[0]与日期[2]得出此结论,这两个值不相同。另一方面:截至日期[2]=自日期[4]这就
任何帮助都将不胜感激。使用
pd.DataFrame.groupby
和pd.to\u 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
:df.groupby
返回一个以给定条件为键的类似dict的对象。由于整个计算是在每个客户上进行的,因此使用了'df.groupby('Customer')groupby
:dt=d.dropna()['To Date'].shift(1)[1:
是数据帧的子集,它只包含单个d
提供数据帧移位1个单元格。这是为了便于比较客户的数据<代码>移位(1)
和到日期
之间的差异从日期
:提供了到日期的d['From Date'][dt.index]==dt
和从日期开始的
之间的布尔值比较结果
:一旦您有一个缺失和未缺失的dt.iloc[i]=res[i]
,您将其分配回列表
,以生成dt
列结果
:将新生成的dfs.append(pd.concat([d,dt]1))
列与原始结果
连接起来,并d
将其追加到
列表中
:result=pd.concat(dfs)
现在包含每个dfs
客户的子集数据帧。将它们连接到单个大数据帧中
:重新指定列名李>result.columns=[“截止日期”、“起始日期”、“结果”]
pd.DataFrame.groupby
和pd.to\u 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
:df.groupby
返回一个以给定条件为键的类似dict的对象。由于整个计算是在每个客户上进行的,因此使用了'df.groupby('Customer')groupby
:dt=d.dropna()['To Date'].shift(1)[1:
是数据帧的子集,它只包含单个d
提供数据帧移位1个单元格。这是为了便于比较客户的数据<代码>移位(1)
和到日期
之间的差异从日期
:提供了到日期的d['From Date'][dt.index]==dt
和从日期开始的
之间的布尔值比较结果
:一旦您有一个缺失和未缺失的dt.iloc[i]=res[i]
,您将其分配回列表
,以生成dt
列结果
:将新生成的dfs.append(pd.concat([d,dt]1))
列与原始结果
连接起来,并d
将其追加到
列表中
:result=pd.concat(dfs)
现在包含每个dfs
客户的子集数据帧。将它们连接到单个大数据帧中
:重新指定列名李>result.columns=[“截止日期”、“起始日期”、“结果”]
df.to_dict()
发布吗?是否要检查缺少两个日期或其中一个日期的行?此外,您无法找到丢失的日期,因为它们最初并不存在。您将只获得该行的索引,在您的情况下是Customer,我相信在我的场景中,如果缺少from date,则也缺少to date。我不需要知道索引。我的想法是添加一个新的专栏,上面写着:失踪或不失踪。如果你能看得更近一些,你会注意到,第一个NaN“真的”丢失了,另外两个没有丢失。(我知道,听起来很混乱,对不起)实际上这是一个报告编写错误,我正在试图修复它。@RafaelC不知道如何做,但我可以发送CSV文件。这对你有用吗?谢谢大家!@RafaelC这就是它的样子:你能把这个df.to_dict()
?你想检查两个日期或其中一个日期都缺失的行吗?此外,您无法找到丢失的日期,因为它们最初并不存在。您将只获得该行的索引,在您的情况下是Customer,我相信在我的场景中,如果缺少from date,则也缺少to date。我不需要知道索引。我的想法是添加一个新的专栏,上面写着:失踪或不失踪。如果你看得更近一些,你会注意到,第一个NaN“真的”不见了,另外两个也不见了。(我知道,这听起来很混乱,对不起)实际上这是一个报告编写错误,我正在试图修复它。@RafaelC不知道如何做,但我可以发送