Python 将熊猫中的多个时间序列连接到单个日期时间索引的最佳方法?

Python 将熊猫中的多个时间序列连接到单个日期时间索引的最佳方法?,python,pandas,dataframe,Python,Pandas,Dataframe,我正在阅读许多CSV文件。每一个都包含时间序列数据。例如: import pandas as pd csv_a = [['2019-05-25 10:00', 25, 60], ['2019-05-25 10:05', 26, 25], ['2019-05-25 10:10', 27, 63], ['2019-05-25 10:20', 28, 62]] df_a = pd.DataFrame(csv_a, columns=["Timest

我正在阅读许多CSV文件。每一个都包含时间序列数据。例如:

import pandas as pd

csv_a = [['2019-05-25 10:00', 25, 60],
         ['2019-05-25 10:05', 26, 25],
         ['2019-05-25 10:10', 27, 63],
         ['2019-05-25 10:20', 28, 62]]
df_a = pd.DataFrame(csv_a, columns=["Timestamp", "Temperature", "Humidity"])
df_a["Timestamp"] = (pd.to_datetime(df_a["Timestamp"]))

csv_b = [['2019-05-25 10:05', 1020],
         ['2019-05-25 10:10', 1021],
         ['2019-05-25 10:15', 1019],
         ['2019-05-25 10:45', 1035]]
df_b = pd.DataFrame(csv_b, columns=["Timestamp", "Pressure"])
df_b["Timestamp"] = (pd.to_datetime(df_b["Timestamp"]))
import datetime as dt

start = dt.datetime(2019,5,25,10,0,0)
end = dt.datetime(2019,5,25,10,20,0)
index = pd.date_range(start, end, freq='5min')
创建这些数据帧后,我们可以看到:

print(df_a)
            Timestamp  Temperature  Humidity
0 2019-05-25 10:00:00           25        60
1 2019-05-25 10:05:00           26        25
2 2019-05-25 10:10:00           27        63
3 2019-05-25 10:20:00           28        62

print(df_b)
            Timestamp  Pressure
0 2019-05-25 10:05:00      1020
1 2019-05-25 10:10:00      1021
2 2019-05-25 10:15:00      1019
3 2019-05-25 10:45:00      1035
我想用常规索引创建一个新的数据帧,例如:

import pandas as pd

csv_a = [['2019-05-25 10:00', 25, 60],
         ['2019-05-25 10:05', 26, 25],
         ['2019-05-25 10:10', 27, 63],
         ['2019-05-25 10:20', 28, 62]]
df_a = pd.DataFrame(csv_a, columns=["Timestamp", "Temperature", "Humidity"])
df_a["Timestamp"] = (pd.to_datetime(df_a["Timestamp"]))

csv_b = [['2019-05-25 10:05', 1020],
         ['2019-05-25 10:10', 1021],
         ['2019-05-25 10:15', 1019],
         ['2019-05-25 10:45', 1035]]
df_b = pd.DataFrame(csv_b, columns=["Timestamp", "Pressure"])
df_b["Timestamp"] = (pd.to_datetime(df_b["Timestamp"]))
import datetime as dt

start = dt.datetime(2019,5,25,10,0,0)
end = dt.datetime(2019,5,25,10,20,0)
index = pd.date_range(start, end, freq='5min')
然后,开始在不同的列中追加每个时间序列,用NaN填充缺少的值,并从索引中划分值

期望输出:

                     Temperature  Humidity  Pressure
Timestamp                                           
2019-05-25 10:00:00         25.0      60.0       NaN
2019-05-25 10:05:00         26.0      25.0    1020.0
2019-05-25 10:10:00         27.0      63.0    1021.0
2019-05-25 10:15:00          NaN       NaN    1019.0
2019-05-25 10:20:00         28.0      62.0       NaN
我也希望尽可能高效地完成这项工作。假设我有数百个CSV和长系列

我正在处理Panda的函数,如concat或append,但我无法获得我想要的。

使用。你可以跟我核实一下 放弃临时跳转大于句点的行。 但是,您可以选择其他条件来排除行。如果要选择其他条件,请告诉我

df2 = (df_a.merge(df_b, on='Timestamp', how='outer')
           .sort_values('Timestamp'))
diff=df2['Timestamp'].diff().abs().bfill()
mask=diff.eq(diff.min())
new_df=(df2.loc[mask]
           .set_index('Timestamp')
       )
print(new_df)


#                     Temperature  Humidity  Pressure
#Timestamp                                           
#2019-05-25 10:00:00         25.0      60.0       NaN
#2019-05-25 10:05:00         26.0      25.0    1020.0
#2019-05-25 10:10:00         27.0      63.0    1021.0
#2019-05-25 10:15:00          NaN       NaN    1019.0
#2019-05-25 10:20:00         28.0      62.0       NaN
您可以选择频率 并通过这样做排除那些不遵守的人

df2 = (df_a.merge(df_b, on='Timestamp', how='outer')
           .set_index('Timestamp')
        )

new_df=(df2.reindex(pd.date_range(df2.index.min(),df2.index.max(),freq='5min'))
           .loc[lambda x: x.isna().all(axis=1).cumsum().eq(0)])
或者按照您在问题中所说的静态输入下限和上限

使用。你可以跟我核实一下 放弃临时跳转大于句点的行。 但是,您可以选择其他条件来排除行。如果要选择其他条件,请告诉我

df2 = (df_a.merge(df_b, on='Timestamp', how='outer')
           .sort_values('Timestamp'))
diff=df2['Timestamp'].diff().abs().bfill()
mask=diff.eq(diff.min())
new_df=(df2.loc[mask]
           .set_index('Timestamp')
       )
print(new_df)


#                     Temperature  Humidity  Pressure
#Timestamp                                           
#2019-05-25 10:00:00         25.0      60.0       NaN
#2019-05-25 10:05:00         26.0      25.0    1020.0
#2019-05-25 10:10:00         27.0      63.0    1021.0
#2019-05-25 10:15:00          NaN       NaN    1019.0
#2019-05-25 10:20:00         28.0      62.0       NaN
您可以选择频率 并通过这样做排除那些不遵守的人

df2 = (df_a.merge(df_b, on='Timestamp', how='outer')
           .set_index('Timestamp')
        )

new_df=(df2.reindex(pd.date_range(df2.index.min(),df2.index.max(),freq='5min'))
           .loc[lambda x: x.isna().all(axis=1).cumsum().eq(0)])
或者像您在问题中所说的那样,简单地静态输入下限和上限

您是否尝试过pd.merge

输出:

                     Temperature  Humidity  Pressure
Timestamp                                           
2019-05-25 10:00:00         25.0      60.0       NaN
2019-05-25 10:05:00         26.0      25.0    1020.0
2019-05-25 10:10:00         27.0      63.0    1021.0
2019-05-25 10:15:00          NaN       NaN    1019.0
2019-05-25 10:20:00         28.0      62.0       NaN
2019-05-25 10:45:00          NaN       NaN    1035.0
你试过pd合并吗

输出:

                     Temperature  Humidity  Pressure
Timestamp                                           
2019-05-25 10:00:00         25.0      60.0       NaN
2019-05-25 10:05:00         26.0      25.0    1020.0
2019-05-25 10:10:00         27.0      63.0    1021.0
2019-05-25 10:15:00          NaN       NaN    1019.0
2019-05-25 10:20:00         28.0      62.0       NaN
2019-05-25 10:45:00          NaN       NaN    1035.0

据我所知,您已经有了一个自定义的datetimeindex索引,并且希望通过该索引加入每个时间序列。首先尝试合并并重新索引。如果要加入多个时间序列,则需要使用循环或python reduce

如果您的时间序列没有相同的列名,您可以尝试加入。只需在括号内列出时间序列[]


据我所知,您已经有了一个自定义的datetimeindex索引,并且希望通过该索引加入每个时间序列。首先尝试合并并重新索引。如果要加入多个时间序列,则需要使用循环或python reduce

如果您的时间序列没有相同的列名,您可以尝试加入。只需在括号内列出时间序列[]


请不要抄袭solution@ansev我不想就此争论,但我认为我们在几分钟内就把问题的答案弄错了。此外,它只是一种合并,没有任何复杂的东西可以复制并作为解决方案打上烙印。如果是这样的话,我应该说所有这些都是从python文档中复制的:请不要抄袭solution@ansev我不想就此争论,但我认为我们在几分钟内就把问题的答案弄错了。此外,它只是一种合并,没有任何复杂的东西可以复制并作为解决方案打上烙印。如果是这样的话,我应该说所有这些都是从python文档中复制的:@安瑟夫:他描述的这一行…从我的索引中划分值。。。给人的印象是他根据预定义的索引加入了数据帧。不过我可能错了:这个解决方案对我很有效:D我可以使用连接循环连接所有东西,然后用reindex修剪它。我不知道combine_first方法,如果你有许多相同系列的片段,它真的很有用。谢谢。@ansev:他的这一行描述……从我的索引中划分值。。。给人的印象是他根据预定义的索引加入了数据帧。不过我可能错了:这个解决方案对我很有效:D我可以使用连接循环连接所有东西,然后用reindex修剪它。我不知道combine_first方法,如果你有许多相同系列的片段,它真的很有用。谢谢