📜  检查 Pandas 中缺少的日期

📅  最后修改于: 2022-05-13 01:55:29.237000             🧑  作者: Mango

检查 Pandas 中缺少的日期

在本文中,我们将学习如何在 Pandas 中检查缺失的日期。

方法:

  • 数据框是使用pd.DataFrame()从列表字典中创建的,它接受数据作为其参数。请注意,这里的字典由两个名为DateName 的列表组成它们的长度相同,并且给定的日期序列中缺少一些日期(从2021-01-18到 2021-01-25 )。我们也可以为这个方法提供一个 CSV 文件,而不是创建我们自己的数据集。
  • df.set_index() 方法将日期设置为我们创建的数据框的索引。可以简单地使用print(df)打印数据框,以在将日期设置为索引之前和之后查看它。

在将日期设置为索引之前:

 DateName
0

2021-01-18 

Jia
12021-01-20Tanya
22021-01-23Rohan
32021-01-25 Sam

日期设置为索引后:



 Name
Date 
2021-01-18 Jia
2021-01-20Tanya
2021-01-23Rohan
2021-01-25Sam
  • 现在,一旦我们将日期设置为索引,我们就将给定的日期列表转换为DateTime 对象。本来,我们列表中的日期是需要转换成DateTime对象的字符串。 Pandas 为我们提供了一个名为to_datetime()的方法,它将字符串格式的日期和时间转换DateTime 对象
  • pd.date_range() 方法接受开始日期结束日期,并在该范围内创建日期序列。
  • Pandas.Index.difference() 返回一个新的索引,其中索引的元素不在其他索引中。因此,通过使用pd.date_range(start date, end date).difference(Date) ,我们可以得到日期列表中不存在的所有日期。返回的数据类型是类似不可变 ndarray 的 datetime64 数据。

示例 1:

Python3
#import pandas
import pandas as pd
  
# A dataframe from a dictionary of lists
data = {'Date': ['2021-01-18', '2021-01-20', 
                 '2021-01-23', '2021-01-25'],
        'Name': ['Jia', 'Tanya', 'Rohan', 'Sam']}
df = pd.DataFrame(data)
  
# Setting the Date values as index
df = df.set_index('Date')
  
# to_datetime() method converts string 
# format to a DateTime object
df.index = pd.to_datetime(df.index)
  
# dates which are not in the sequence 
# are returned
print(pd.date_range(
  start="2021-01-18", end="2021-01-25").difference(df.index))


Python3
#import pandas
import pandas as pd
  
# A dataframe from a dictionary of lists
d = {'Date': ['2021-01-10', '2021-01-14', '2021-01-18', 
              '2021-01-25', '2021-01-28', '2021-01-29'],
     'Total People': [20, 21, 19, 18, 13, 56]}
df = pd.DataFrame(d)
  
# Setting the Totale People as index
df = df.set_index('Total People')
  
# to_datetime() method converts string 
# format to a DateTime object
df['Date'] = pd.to_datetime(df['Date'])
  
# dates which are not in the sequence 
# are returned
my_range = pd.date_range(
  start="2021-01-10", end="2021-01-31", freq='B')
  
print(my_range.difference(df['Date']))


输出:

最后,我们得到了 2021-01-18 和 2021-01-25 之间缺失的所有日期。

示例 2:

让我们考虑另一个例子。但是,这次我们不会将日期设置为索引,而是会在pd.date_range()函数分配freq='B' (工作日频率)。

就像前面的例子一样,我们从列表字典中创建了一个数据框。但是,这次我们没有将日期值设置为索引。相反,我们将“Total People”列设置为我们的索引值。使用以开始日期、结束日期和频率作为参数的pd.date_range()函数,我们提供值。我们设置 freq= 'B'(工作日频率)以省略周末。最后, Pandas.Index.difference()日期列作为参数并返回所有不在给定值集中的值。

蟒蛇3

#import pandas
import pandas as pd
  
# A dataframe from a dictionary of lists
d = {'Date': ['2021-01-10', '2021-01-14', '2021-01-18', 
              '2021-01-25', '2021-01-28', '2021-01-29'],
     'Total People': [20, 21, 19, 18, 13, 56]}
df = pd.DataFrame(d)
  
# Setting the Totale People as index
df = df.set_index('Total People')
  
# to_datetime() method converts string 
# format to a DateTime object
df['Date'] = pd.to_datetime(df['Date'])
  
# dates which are not in the sequence 
# are returned
my_range = pd.date_range(
  start="2021-01-10", end="2021-01-31", freq='B')
  
print(my_range.difference(df['Date']))

输出:

请注意,除了 2021-01-23、2021-01-24 和 2021-01-30 之外的所有缺失值都被返回,因为我们设置了freq='B'忽略了所有周末。