Python 将熊猫中的多个时间序列连接到单个日期时间索引的最佳方法?
我正在阅读许多CSV文件。每一个都包含时间序列数据。例如: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
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方法,如果你有许多相同系列的片段,它真的很有用。谢谢