我认为我的问题涉及几个部分。
我有什么?
两个数据帧。两者都以TimeStamp格式索引。时间是相似的,例如从14:00到18:00和从13:30到18:30。但是时间间隔是不同的(一个数据帧每3秒就有数据,一个数据帧的不确定时间间隔约为0.6秒)。数据帧不同,一个包括GPS坐标(2列+索引),一个NO2浓度(1列+索引)。
我到底想要什么?
具有所有3列(GPS + NO2)的一个数据帧(再次用时间戳记索引)。我想将索引的时间间隔设置为1s。这意味着,两个数据帧都必须进行插值,因为两个数据帧可能都没有值,例如15:30.56(但在15:30.55.635和15:30.58.001)
到目前为止,我尝试了什么?
集中两个数据框。但是我得到的是一个数据框,该数据框现在包含了我想要的所有3列,但索引是NO2数据集的时间,只有正确填充了NO2的列(另外两列包括NaN)
这是代码行:
allTheData = pd.concat([gpsDataFrame, no2DataFrame], axis=1)
我是Pandas的新手,而Python是新手。希望您可以通过以下两个步骤帮助我:
创建一个dataFrame'allTheData',其中按时间顺序包括所有测量时间(来自gps或No2)和正确的数据。例如,如果两个数据帧中都有15:30.05的数据,则仅添加一行并包括所有3列;如果只有15:30.07的gps数据包含gps数据,并将No2设置为NaN或其他内容。
插值,以便我可以选择一个1秒的间隔,并每隔1秒从gps AND no2获取插值数据,因此每行一次。
最佳答案
使用pandas.resample
调整两个数据帧以使其具有与索引相同的时间戳记:
import pandas as pd
import numpy as np
# generate some sample data according to your question
date1 = pd.date_range("14:00", "18:00", freq="3S")
df1 = pd.DataFrame({"time": date1, "gps": np.random.rand(len(date1))})
date2 = pd.date_range("13:30", "18:30", freq="600ms")
df2 = pd.DataFrame({"time": date2, "no2": np.random.rand(len(date2))})
# set the timestamps as index
df1 = df1.set_index("time")
df2 = df2.set_index("time")
final_freq = "1S"
# upsample df1, interpolating
df1 = df1.resample(final_freq)
df1 = df1.interpolate(method='linear') # without this, these entries are NaN
# downsample df2, averaging
df2 = df2.resample(final_freq).mean()
然后,您可以
join
它们:df = df1.join(df2)
请注意,如果您的gps位置是单列中的元组,则可能需要对此稍作更改。在这种情况下,可能需要将其分为纬度和经度两列,以便进行上采样。
除了对下采样取平均值以外,使用其他函数可能更有意义。例如,如果您的NO2传感器报告在最近的0.6秒内看到了多少NO2,则您需要
.sum()
。关于python - 关于日期串联两个DataFrame,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49997700/