Pandas时间序列与缺失数据/记录的比较

2024-06-16 14:59:04 发布

您现在位置:Python中文网/ 问答频道 /正文

这个问题与我之前的一个问题(Remapping `numpy.array` with missing values)有点关系,当时我正为丢失数据的时间序列而挣扎,有人建议“使用熊猫!”。所以我来。。。在

我处理的是大数据集,基本上是由来自不同观测点的时间序列组成,我想在这里对这些观测点进行统计比较。这些数据集相当混乱;大量丢失的数据(用-99表示)、丢失的时间记录(一个站点可能有时间记录,另一个站点没有),我只想包括/比较数据,其中要么(1)所有站点都有某个变量的数据,要么(2)我要比较的两个站点都有该变量的数据,忽略其他站点是否有数据。在

举个最小的例子:

import pandas as pd
from io import StringIO

data = StringIO("""\
  1,  2001-01-01, 00:00, 1.0, 0.5, 1.0
  1,  2001-01-01, 01:00, 1.1, 0.6, 2.0
  1,  2001-01-01, 02:00, 1.2, 0.7, 3.0
  1,  2001-01-01, 03:00, 1.3, 0.8, 4.0

  2,  2001-01-01, 00:00, 2.0, -99, -99
  2,  2001-01-01, 01:00, -99, 1.6, 2.0
  2,  2001-01-01, 02:00, 2.2, 1.7, 3.0
  2,  2001-01-01, 03:00, 2.3, 1.8, 4.0

  3,  2001-01-01, 00:00, 3.0, 2.5, 1.0
  3,  2001-01-01, 01:00, 3.1, 2.6, -99
  3,  2001-01-01, 02:00, -99, -99, 3.0
  3,  2001-01-01, 03:00, 3.3, 2.8, 4.0
  3,  2001-01-01, 04:00, 3.4, 2.9, 5.0
""")

columns = ['id','date','time','T','Td','cc']
df = pd.read_table(data, header=None, names=columns, delimiter=',', na_values=-99, parse_dates=[['date','time']])

其中-99表示缺少值。我想比较来自不同站点(列id)的数据(列TTdcc),但如前所述,只有两个或所有{}都有我感兴趣的变量的数据(完全忽略其他列中的数据是否丢失)。在

所以在这个例子中,如果所有站点都需要有数据,比较T只会导致比较来自2001-01-01, 00:00和{}的数据,因为在其他时间,id=2或{}都丢失了T,而{}的最后一条时间记录在另一个id中完全不存在

我已经玩了几个小时了,但说实话,我真的不知道从哪里开始。是否可以使用上面概述的标准提取一个numpy.array,大小为n_sites x n_valid_values3x2,在这个例子中),然后我可以用它来做进一步的分析?在

编辑作为一个部分但实际上(确实)丑陋的解决方案,类似这样的方法似乎有效:

^{pr2}$

但这仍然没有删除id=3date_time=2001-01-01, 04:00的记录,我想/希望有更优雅的方法使用Pandas。在


Tags: 数据importnumpyiddatetime站点记录
1条回答
网友
1楼 · 发布于 2024-06-16 14:59:04

一种可行的方法(基于此:https://stackoverflow.com/a/34985243/3581217答案)是创建一个Dataframe,其中来自不同站点的观测值具有不同的列,然后使用subset设置为所有列或我要比较的两个站点,这将删除丢失数据的所有行。在

import pandas as pd
import numpy as np
from io import StringIO

data1 = StringIO("""\
  1,  2001-01-01, 00:00, 1.0
  1,  2001-01-01, 01:00, 1.1
  1,  2001-01-01, 02:00, 1.2
  1,  2001-01-01, 03:00, 1.3
""")

data2 = StringIO("""\
  2,  2001-01-01, 00:00, 2.0
  2,  2001-01-01, 01:00, -99
  2,  2001-01-01, 02:00, 2.2
  2,  2001-01-01, 03:00, 2.3
""")

data3 = StringIO("""\
  3,  2001-01-01, 00:00, 3.0
  3,  2001-01-01, 01:00, 3.1
  3,  2001-01-01, 02:00, -99
  3,  2001-01-01, 03:00, 3.3
  3,  2001-01-01, 04:00, 3.4
""")

columns = ['id','date','time','T1']
df1 = pd.read_table(data1, header=None, names=columns, delimiter=',', na_values=-99, parse_dates=[['date','time']])
columns = ['id','date','time','T2']
df2 = pd.read_table(data2, header=None, names=columns, delimiter=',', na_values=-99, parse_dates=[['date','time']])
columns = ['id','date','time','T3']
df3 = pd.read_table(data3, header=None, names=columns, delimiter=',', na_values=-99, parse_dates=[['date','time']])

df = pd.concat([df1,df2,df3]).groupby('date_time').max()
df = df.dropna(subset=['T1','T2','T3'])

得到的Dataframe看起来像:

^{pr2}$

如果我只想比较两个站点,在本例中忽略T3,那么df.dropna(subset=['T1','T2'])会导致:

In [234]: df
Out[234]: 
                      T1   T2   T3  id
date_time                             
2001-01-01 00:00:00  1.0  2.0  3.0   3
2001-01-01 02:00:00  1.2  2.2  NaN   3
2001-01-01 03:00:00  1.3  2.3  3.3   3

这是走这条路吗?还是觉得有点不像熊猫。。?在

相关问题 更多 >