如何检查 Pandas 日期时间列的缺失值?

Posted

技术标签:

【中文标题】如何检查 Pandas 日期时间列的缺失值?【英文标题】:How do I check a Pandas Datetime column for missing values? 【发布时间】:2020-06-03 16:13:39 【问题描述】:

我必须检查来自仪器的一些数据,并且必须确保没有丢失的时间间隔。 所以例如我有一个这样的数据框:

我尝试生成一个新的日期时间系列 pd.date_range('2020-02-17 10:29:25', periods=1440, freq='T') 并试图比较它。但我被卡住了。

【问题讨论】:

请不要发布您的数据图像。将其粘贴到您的问题中 始终将数据作为文本放置,以便我们可以使用它。 您可以使用来自Datetime 的移位数据创建列,这样您将在一行中有两个值,然后您可以减去它们,看看结果是否大于 1 分钟 是的,我知道一张照片的选择有多糟糕。抱歉各位,下次用代码! 【参考方案1】:

您可以尝试创建一个日期范围并检查 DataFrame 列中缺少哪些值。像这样:

df=pd.DataFrame('Datetime':[*pd.date_range('2020-02-17 10:29:25', periods=3, freq='T'), *pd.date_range('2020-02-17 10:49:25', periods=3, freq='T')])
df
             Datetime
0 2020-02-17 10:29:25
1 2020-02-17 10:30:25
2 2020-02-17 10:31:25
3 2020-02-17 10:49:25
4 2020-02-17 10:50:25
5 2020-02-17 10:51:25

my_range = pd.date_range(start=df['Datetime'].min(), end=df['Datetime'].max(), freq='T')

my_range[~my_range.isin(df['Datetime'])]
DatetimeIndex(['2020-02-17 10:32:25', '2020-02-17 10:33:25',
               '2020-02-17 10:34:25', '2020-02-17 10:35:25',
               '2020-02-17 10:36:25', '2020-02-17 10:37:25',
               '2020-02-17 10:38:25', '2020-02-17 10:39:25',
               '2020-02-17 10:40:25', '2020-02-17 10:41:25',
               '2020-02-17 10:42:25', '2020-02-17 10:43:25',
               '2020-02-17 10:44:25', '2020-02-17 10:45:25',
               '2020-02-17 10:46:25', '2020-02-17 10:47:25',
               '2020-02-17 10:48:25'],
              dtype='datetime64[ns]', freq='T')

或者你可以使用这个(灵感来自@furas):

df_missing = df[df['Datetime'].diff()>pd.Timedelta('60s')]
df_missing['diff'] = df.diff()
df_missing

             Datetime     diff
3 2020-02-17 10:49:25 00:18:00

【讨论】:

更简单的版本很有趣(+1) 这两个版本对我的理解都非常有帮助。谢谢。【参考方案2】:

您可以将Datetime 放在新列中,但向下移动一行,这样您将在一行中有两个值,您可以将它们相减并检查结果是否大于 1 分钟。

import pandas as pd
import datetime

data = 'Datetime': [
    '2020-02-17 10:29:25',
    '2020-02-17 10:30:25',
    '2020-02-17 10:31:25',
    '2020-02-17 10:45:25',    
    '2020-02-17 10:46:25',    
]

df = pd.DataFrame(data)
df['Datetime'] = pd.to_datetime(df['Datetime'])

df['DT2'] = df['Datetime'].shift(1)
df['diff'] = df['Datetime'] - df['DT2']

# all values

print(df)

# compare with 1 minut

print(df[df['diff'] > datetime.timedelta(seconds=60)])

结果

# all values

             Datetime                 DT2     diff
0 2020-02-17 10:29:25                 NaT      NaT
1 2020-02-17 10:30:25 2020-02-17 10:29:25 00:01:00
2 2020-02-17 10:31:25 2020-02-17 10:30:25 00:01:00
3 2020-02-17 10:45:25 2020-02-17 10:31:25 00:14:00
4 2020-02-17 10:46:25 2020-02-17 10:45:25 00:01:00

# compare with 1 minut

             Datetime                 DT2     diff
3 2020-02-17 10:45:25 2020-02-17 10:31:25 00:14:00

编辑:请参阅@luigigi 答案以了解使用

的更简单版本
df[ df['Datetime'].diff() > pd.Timedelta('60s') ]

【讨论】:

@luigigi 谢谢,这是非常有趣的版本。我添加了有关您的答案的信息。【参考方案3】:

检查每一行与下一行相比是否为 -1 分钟,如果不是,则执行某些操作。

for i in range(len(df.index)-1):
   if datetime.datetime.strptime(df.loc[i, 'DateTime'], '%Y-%m-%d %H:%M:%S) != datetime.datetime.strptime(df.loc[i+1, 'DateTime'], '%Y-%m-%d %H:%M:%S) + datetime.timedelta(minutes=1):
      print('Data missing')

【讨论】:

以上是关于如何检查 Pandas 日期时间列的缺失值?的主要内容,如果未能解决你的问题,请参考以下文章

Python Pandas 插值:在缺失的日期范围内重新分配值

在 Pandas 数据框列中填充缺失的日期值

Pandas 中日期列的最大值/最小值,列包含 nan 值

将 pandas 列转换为 datetime64,包括缺失值

Pandas:使用日期时间索引进行分组前向填充

填写缺失的日期值并根据前一行填充第二列