提问人:luffe 提问时间:6/4/2012 最后编辑:piRSquaredluffe 更新时间:1/5/2017 访问量:2211
将未对齐的时间序列加载到 DataFrame 中,使用一个索引?
Load un-aligned time series into a DataFrame, with one index?
问:
我开始学习这个很棒的工具,我被困在加载几个时间序列并将它们与“主”日期向量对齐的简单任务上。
例如:我有一个 csv 文件:Data.csv,其中第一行包含标题,其中 Date1 是 Rate1 的日期,Date2 是 Rate2 的日期。"Date1, Rate1, Date2, Rate2"
在本例中,Rate2 具有较多的观测值(开始日期与 Date1 相同,但结束日期比 Date1 中的结束日期相距更远,并且缺失值较少),并且应根据 Date2 对所有内容进行索引。
获取以下 DataFrame 的首选方法是什么?(或完成类似的事情)
index(Date2) Rate1 Rate2
11/12/06 1.5 1.8
12/12/06 NaN 1.9
13/12/06 1.6 1.9
etc
etc
11/10/06 NaN 1.2
12/10/06 NaN 1.1
13/10/06 NaN 1.3
我试图效仿官方熊猫.pdf和谷歌搜索中的例子,但无济于事。(我什至买了麦金尼先生的《熊猫》一书的预版,但关于熊猫的章节还没有准备好:()
有没有很好的食谱?
谢谢
编辑:关于将系列一分为二的答案。CSV 文件: 但是,如果我有很多时间序列,例如
日期1 速率1 日期2 速率2 ...日期N 率N
我所知道的是,日期应该几乎相同,但包含缺失值的序列(没有日期或利率条目)除外(顺便说一句,这将是一些金融经济学时间序列的一个例子)
加载此数据集的首选方法仍然是将每个系列拆分为单独的 .CSV?
EDIT2 archlight 是完全正确的,只是做“csv_read”会把事情搞砸。
从本质上讲,我的问题可以归结为:如何连接几个未对齐的时间序列,其中每个序列都有一个日期列,以及序列本身的列(.从 Excel 导出的 CSV 文件)
再次感谢
答:
如果您确定 Date1 是 Date2 的子集,并且 Date2 不包含空值,则只需执行以下操作即可
df = read_csv('foo.csv', index_col=2, parse_dates=True)
df = df[["rate1", "rate2"]]
但如果 Date2 有 Date1 没有的日期,那就很复杂了。我建议您将日期/速率对放在单独的文件中,并将日期作为公共标题
df1 = read_csv('foo1.csv', index_col=0, parse_dates=True)
df2 = read_csv('foo2.csv', index_col=0, parse_dates=True)
df1.join(df2, how="outer")
编辑:这种方法看起来不太好。所以对于你的 NaN 在你的日期时间,你可以做 sth like
dateindex2 = map(lambda x: datetime(int("20"+x.split("/")[2]), int(x.split("/")[0]), int(x.split("/")[1])), filter(notnull, df['Date2'].values))
ts2 = Series(df["Rate2"].dropna(), index=dateindex2)
#same for ts1
df2 = DataFrame({"rate1":ts1, "rate2":ts2})
问题是你必须确保存在日期而不是速率等情况。因为 dropna() 会移位记录并与索引不匹配
评论
我认为没有必要将数据拆分为多个文件。如何加载文件并将每个日期/费率对转换为单独的时间序列?因此,您的代码将如下所示:read_csv
data = read_csv('foo.csv')
ts1 = Series(data['rate1'], index=data['date1'])
ts2 = Series(data['rate2'], index=data['date2'])
现在,要连接在一起并对齐 DataFrame 中的数据,您可以执行以下操作:
frame = DataFrame({'rate1': ts1, 'rate2': ts2})
这将形成日期的并集,并对齐所有数据(在适当的情况下插入 NA 值)。ts1
ts2
或者,如果您有 N 个时间序列,您可以执行以下操作:
all_series = {}
for i in range(N):
all_series['rate%d' % i] = Series(data['rate%d' % i], index=data['date%d' % i])
frame = DataFrame(all_series)
在我的经验中,这是一种非常常见的模式
评论