【问题标题】:Pandas time series comparison with missing data/recordsPandas 与缺失数据/​​记录的时间序列比较
【发布时间】:2017-02-12 17:48:30
【问题描述】:

这个问题与我之前的一个问题 (Remapping `numpy.array` with missing values) 有点相关,当时我正在努力处理缺少数据的时间序列,有人建议“使用 Pandas!”。所以我去...

我正在处理大型数据集,基本上由来自不同观察地点的时间序列组成,我想在其中对这些地点进行统计比较。这些数据集相当混乱;大量丢失的数据(用例如-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 列),但如上所述,只有两个或所有 id 有数据我感兴趣的变量(完全忽略其他列的数据是否丢失)。

因此对于本例,如果所有站点都需要数据,比较 T 只会导致比较来自 2001-01-01, 00:0003:00 的数据,因为对于其他时间,id=2id=3 是缺少T,而id=3 的最后一次记录在其他id 中完全不存在。

我已经玩了好几个小时了,但老实说,我真的不知道从哪里开始。是否可以使用上述标准提取大小为n_sites x n_valid_values(本示例为3x2)的numpy.array,然后我可以将其用于进一步分析?

EDIT 作为一个部分但真的(真的)丑陋的解决方案,这样的事情似乎有效:

# Loop over all indexes where T is nan:
for i in np.where(df['T'].isnull())[0]:
    # For each of them, set records with the same date_time to nan
    j = np.where(df['date_time'] == df['date_time'][i])[0]
    df['T'][j] = np.nan
# Drop all records where T is nan
df2 = df.dropna(subset=['T'])

# Group by the different stations:
g = df2.groupby('id')

# Get the arrays (could automate this based on the unique id's):
v1 = g.get_group(1)['T']
v2 = g.get_group(2)['T']
v3 = g.get_group(3)['T']

但这仍然没有打破id=3date_time=2001-01-01, 04:00 的记录,我猜/希望Pandas 有更优雅的方法。

【问题讨论】:

  • 为什么这些2, 2001-01-01, 00:00, 2.0, -99, -99 -99 可以?
  • 在这种情况下,我只对T 列是否有数据感兴趣,而忽略其他的。

标签: python pandas time-series


【解决方案1】:

一种似乎可行的方法(基于此:https://stackoverflow.com/a/34985243/3581217 答案)是创建一个Dataframe,其中来自不同站点的观察具有不同的列,然后是一个dropna()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 如下所示:

In [232]: df
Out[232]: 
                      T1   T2   T3  id
date_time                             
2001-01-01 00:00:00  1.0  2.0  3.0   3
2001-01-01 03:00:00  1.3  2.3  3.3   3

如果我只想比较两个网站,在这种情况下忽略 T3df.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

这是要走的路吗?还是觉得有点不像熊猫……?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-19
    • 2018-06-14
    • 2020-10-13
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 2015-11-21
    • 2022-01-06
    相关资源
    最近更新 更多