我开始学习这个很棒的工具,我很难完成加载几个时间序列并将它们与“主”日期向量对齐的简单任务。
例如:我有一个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
我试图按照官方pandas.pdf和Googling中的示例进行操作,但无济于事。 (我甚至买了麦金尼先生的Pandas书的预编辑,但是那些章节让熊猫还没有准备就绪:()
有一个不错的食谱吗?
非常感谢
编辑:关于将系列分成两个.CSV文件的答案: 但是,如果我有很多时间序列,例如
Date1 Rate1 Date2 Rate2 ... DateN RateN
我所知道的是日期应该几乎相同,例外来自包含缺失值的系列(没有日期或费率条目)(这将是一些金融经济学时间序列的例子,方式)
加载此数据集的首选方法是将每个系列拆分为单独的.CSV吗?
EDIT2 archlight是完全正确的,只是做“csv_read”会搞砸。
基本上我的问题可以归结为:如何加入几个未对齐的时间序列,其中每个系列都有一个日期列,系列本身的列(从Excel导出的.CSV文件)< / p>
再次感谢
答案 0 :(得分:2)
我不认为将数据拆分成多个文件是必要的。如何使用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})
这将构成ts1
和ts2
中日期的并集,并对齐所有数据(在适当的位置插入NA值)。
或者,如果你有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)
根据我的经验,这是一种非常常见的模式
答案 1 :(得分:1)
如果您确定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,你可以这样做
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()会移动记录并与索引
不匹配