Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找丢失的日期_Python_Time Series - Fatal编程技术网

Python 查找丢失的日期

Python 查找丢失的日期,python,time-series,Python,Time Series,我正在尝试编写一个函数,可以在数据帧中查找丢失的日期 这是我的设想: (数据按客户排序,然后按起始日期排序。 日期格式为:M/D/Y) 函数应继续读取From Date和To Date,并查看日期(对于每个客户)是否具有连续性。然后,添加一列(结果)并显示结果 该函数必须对每个客户进行迭代 (添加评论) 请看一下我的预期产出。我正在添加索引和一些解释: 索引[1]显示缺失,因为连续性被破坏,您可以通过比较日期[0]与日期[2]得出此结论,这两个值不相同。另一方面:截至日期[2]=自日期[4]这就

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

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

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

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

(添加评论)

请看一下我的预期产出。我正在添加索引和一些解释: 索引[1]显示缺失,因为连续性被破坏,您可以通过比较日期[0]与日期[2]得出此结论,这两个值不相同。另一方面:截至日期[2]=自日期[4]这就是为什么“结果”显示未缺失[3]


任何帮助都将不胜感激。

使用
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
    groupby
    返回一个以给定条件为键的类似dict的对象。由于整个计算是在每个客户上进行的,因此使用了'df.groupby('Customer')
  • 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
    groupby
    返回一个以给定条件为键的类似dict的对象。由于整个计算是在每个客户上进行的,因此使用了'df.groupby('Customer')
  • 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不知道如何做,但我可以发送