将未对齐的时间序列加载到DataFrame中,只有一个索引?

时间:2012-06-04 15:22:53

标签: python pandas

我开始学习这个很棒的工具,我很难完成加载几个时间序列并将它们与“主”日期向量对齐的简单任务。

例如:我有一个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>

再次感谢

2 个答案:

答案 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})

这将构成ts1ts2中日期的并集,并对齐所有数据(在适当的位置插入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()会移动记录并与索引

不匹配