Python 当索引不对齐时,如何对两个数据帧中的字段求和?

Python 当索引不对齐时,如何对两个数据帧中的字段求和?,python,pandas,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

我对复杂的数据分析是全新的,尤其是熊猫。我有一种感觉,熊猫应该能够轻松地处理这项任务,但我的新手身份使我无法找到解决办法。我想在每天给定的时间,即本例中的下午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
请注意,这两个文件实际上都没有下午3点的记录,而这两个文件并不总是有任何给定日期的记录。第一个文件缺少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的新输入数据帧,然后对其值列进行求和,仅键入日期,或者在求和操作期间,选择任何给定日期时间最大的记录,时间首先组合数据帧:

为了使所有内容都在一个表中,接下来使用groupby跨时间戳求和:

df4 = df3.groupby('datetime').aggregate(sum)
现在,d4有一个值列,它是所有匹配datetime列的总和。 假设将时间戳作为datetime对象,则可以在任何阶段执行任何筛选操作:

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

我不确定您到底想做什么,您可能需要在筛选之前解析时间戳列。

我不清楚aggregatesum调用将如何工作,因为所有datetime值实际上都不相同。我最后得到的只是一个数据帧,它的行数与两个被粉碎在一起的数据帧的行数相同。是否有某种方法可以过滤两个输入数据框中的记录,以便它们有一个日期列,其中的行是在任何给定日期从原始数据框中选择的,并且开始的时间最长,有没有一种方法可以使用一个选择器来调用groupby方法,该选择器只关闭datetime列的date部分?如果您有一个特定的日期,您可以在groupby之前进行筛选:filter=df['datetime']。applydatetime.datetime.date==datetime.date2013,3,11,然后像这样应用筛选器:df_filtered=df[filter]此外,您还可以添加一个新列,该列仅为日期,并在此基础上进行筛选:df['date']=df['datetime'].applydatetime.datetime.date没有特定的日期,但我想按日期对行进行分组。假设有两行的datetime字段具有相同的日期。我希望他们一起分组。我认为最简单的方法是使用上面的注释创建一个日期列并按该列分组。默认情况下,csv有一个整数索引。您应该在两个数据帧上调用df1.set_索引'datetime'。然后您可以将它们添加到normall df1+df2。
filtered = df[df['datetime'] < datetime.datetime(year, month, day, hour, minute, second)]