【发布时间】: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 列)的数据(T、Td、cc 列),但如上所述,只有两个或所有 id 有数据我感兴趣的变量(完全忽略其他列的数据是否丢失)。
因此对于本例,如果所有站点都需要数据,比较 T 只会导致比较来自 2001-01-01, 00:00 和 03:00 的数据,因为对于其他时间,id=2 或 id=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=3、date_time=2001-01-01, 04:00 的记录,我猜/希望Pandas 有更优雅的方法。
【问题讨论】:
-
为什么这些
2, 2001-01-01, 00:00, 2.0, -99, -99-99 可以? -
在这种情况下,我只对
T列是否有数据感兴趣,而忽略其他的。
标签: python pandas time-series