关于日期

时间:2018-04-24 09:11:50

标签: python pandas dataframe timestamp

我认为我的问题涉及一些部分。 我有什么?

  • 两个数据帧。两者都使用TimeStamp格式编制索引。时间段类似,我们说从14:00到18:00和13:30到18:30。但是时间间隔是不同的(一个数据帧每3秒有一个数据,一个有不确定的时间间隔约为0.6秒)。数据帧不同,一个包括GPS坐标(2列+索引),一个NO2浓度(1列+索引)。

最终我想要什么?

  • 一个数据帧(再次使用TimeStamps索引),包含所有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的新手。希望你能帮助我完成这两个步骤:

  1. 创建一个dataFrame' allTheData'其中包括按时间顺序排列的所有测量时间(来自gps或No2)和正确的数据。例如,如果两个数据帧中有15:30.05的数据,则只添加一行并包含所有3列;如果在15:30.07只有来自gps的数据包括gps数据并将No2设置为NaN或其他东西。

  2. 对数值进行插值,以便我可以选择1秒的间隔,并且每1秒从gps和no2获取插值数据,因此每行。

1 个答案:

答案 0 :(得分:2)

使用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()