如何检查 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 插值:在缺失的日期范围内重新分配值