当索引不排成时,如何在两个DataFrame上求和字段?

时间:2014-06-23 19:58:43

标签: python pandas

我对复杂的数据分析,特别是对大熊猫来说是全新的。我有一种感觉,熊猫应该能够轻松地完成这项任务,但我的新手让我无法看到解决方案的途径。我想在每天的给定时间,在这种情况下下午3点,将两列文件的一列相加。如果一个文件当天下午3点没有记录,我想使用之前的记录。

让我举一个具体的例子。我有两个CSV文件中的数据。以下是一些小例子:

datetime    value
2013-02-28 09:30:00 0.565019720442
2013-03-01 09:30:00 0.549536266504
2013-03-04 09:30:00 0.5023031467
2013-03-05 09:30:00 0.698370467751
2013-03-06 09:30:00 0.75834927162
2013-03-07 09:30:00 0.783620442226
2013-03-11 09:30:00 0.777265379462
2013-03-12 09:30:00 0.785787872851
2013-03-13 09:30:00 0.784873183044
2013-03-14 10:15:00 0.802959366653
2013-03-15 10:15:00 0.802959366653
2013-03-18 10:15:00 0.805413095911
2013-03-19 09:30:00 0.80816233134
2013-03-20 10:15:00 0.878912249996
2013-03-21 10:15:00 0.986393922571

和另一个:

datetime    value
2013-02-28 05:00:00 0.0373634672097
2013-03-01 05:00:00 -0.24700085273
2013-03-04 05:00:00 -0.452964976056
2013-03-05 05:00:00 -0.2479288295
2013-03-06 05:00:00 -0.0326855588777
2013-03-07 05:00:00 0.0780461766619
2013-03-08 05:00:00 0.306247682656
2013-03-11 06:00:00 0.0194146154407
2013-03-12 05:30:00 0.0103653153719
2013-03-13 05:30:00 0.0350377752558
2013-03-14 05:30:00 0.0110884755383
2013-03-15 05:30:00 -0.173216846788
2013-03-19 05:30:00 -0.211785013352
2013-03-20 05:30:00 -0.891054563968
2013-03-21 05:30:00 -1.27207563599
2013-03-22 05:30:00 -1.28648629004
2013-03-25 05:30:00 -1.5459897419

请注意:a)两个文件实际上都没有3pm记录,b)这两个文件并不总是有任何给定日期的记录。 (2013-03-08在第一个文件中丢失,而2013-03-18在第二个文件中丢失,第一个文件在第二个文件之前结束。)作为输出,我想象一个这样的数据帧(也许只是没有的日期)时间):

datetime    value
2013-Feb-28 15:00:00    0.6023831876517
2013-Mar-01 15:00:00    0.302535413774
2013-Mar-04 15:00:00    0.049338170644
2013-Mar-05 15:00:00    0.450441638251
2013-Mar-06 15:00:00    0.7256637127423
2013-Mar-07 15:00:00    0.8616666188879
2013-Mar-08 15:00:00    0.306247682656
2013-Mar-11 15:00:00    0.7966799949027
2013-Mar-12 15:00:00    0.7961531882229
2013-Mar-13 15:00:00    0.8199109582998
2013-Mar-14 15:00:00    0.8140478421913
2013-Mar-15 15:00:00    0.629742519865
2013-Mar-18 15:00:00    0.805413095911
2013-Mar-19 15:00:00    0.596377317988
2013-Mar-20 15:00:00    -0.012142313972
2013-Mar-21 15:00:00    -0.285681713419
2013-Mar-22 15:00:00    -1.28648629004
2013-Mar-25 15:00:00    -1.5459897419

我有一种感觉,这可能是熊猫中的三个班轮,但对我来说,如何做到这一点并不是很清楚。使我对这个问题的思考更加复杂化,更复杂的CSV文件可能在一天内(同一日期,不同时间)有多个记录。似乎我需要以某种方式生成一对新的输入数据帧,时间为15:00,然后在它们的值列之间求和,只关键日期,或者在求和操作期间选择任何给定日期最长时间的记录时间< = 15:00:00。鉴于无法比较datetime.time对象的大小,我怀疑我可能必须将具有相同日期的行组合在一起,然后在每个组中,仅选择最接近(但不大于)3pm的行。那时我的大脑爆炸了。

我无处可查看文档,因为我不太了解pandas支持的所有类似数据库的操作。非常感谢相关文档(特别是教程)的指示。

1 个答案:

答案 0 :(得分:0)

首先合并您的DataFrames

df3 = df1.append(df2)

以便所有内容都在一个表格中,然后使用groupby对时间戳进行求和:

df4 = df3.groupby('datetime').aggregate(sum)

现在d4的value列是所有匹配datetime列的总和。 假设您有时间戳作为datetime个对象,您可以在任何阶段进行任何您喜欢的过滤:

filtered = df[df['datetime'] < datetime.datetime(year, month, day, hour, minute, second)]

我不确定您要做什么,在过滤之前,您可能需要解析时间戳列。