我有一个数据帧,大致如下所示:

timestamp mmsi departures_count calc_speed coursechange
2012-01-31 07:11:59 1.252340e+12 1 4.041755 0.000000
2012-01-31 07:22:20 1.252340e+12 1 5.209561 30.000000
2012-01-31 07:35:34 1.252340e+12 2 5.766184 1.000000
2012-01-31 07:45:35 1.252340e+12 2 5.932638 4.000000
2016-11-24 17:05:21 2.775153e+14 1 1.673716 17.000000
2016-11-24 17:21:21 2.775153e+14 1 0.725156 180.800003
2016-11-24 17:38:40 2.775153e+14 1 0.418093 117.500003

Dataframe有更多的列和更多的行(2284331行x 16列),但这些是操作所需的重要行.

它由指示相关行程的唯一标识符mmsidepartures_count组成.由于数据点之间的时间步长差异很大,我正在try 重新采样数据以进行更好的比较.我希望时间步长始终为10分钟.这意味着,如果在10分钟内有多个数据点,我希望对数据进行上采样,如果存在较大的时间间隔,则对其进行下采样(使用内插法).这需要为每mmsi人中的每departures_count人这样做.

我try 使用以下代码,但它不是只返回NaN的值,就是为行程(出发)的每一行返回相同的值.

timeindex = pd.to_datetime(df['timestamp'], format='%Y-%m-%d %H:%M:%S')
df.index = timeindex
group = df.groupby(['mmsi', 'departures_count'])
df_test = group[['coursechange', 'calc_speed']].resample('10Min').interpolate(method='linear')

如果可能的话,我也想将内插方法改为立方而不是线性. 如有任何建议,我们将不胜感激!

推荐答案

您可以try :

def fn(g):
    rng = pd.date_range(
        g.index[0].floor("10min"), g.index[-1].ceil("10min"), freq="10min"
    )
    g = (
        g.reindex(g.index.union(rng))
        .interpolate(method="linear", limit_direction="both")
        .reindex(rng)
    )
    return g


df["timestamp"] = pd.to_datetime(df["timestamp"])
df = df.set_index("timestamp")

out = df.groupby(["mmsi", "departures_count"], group_keys=False).apply(fn)
print(out)

打印:

                             mmsi  departures_count  calc_speed  coursechange
2012-01-31 07:10:00  1.252340e+12               1.0    4.041755      0.000000
2012-01-31 07:20:00  1.252340e+12               1.0    4.625658     15.000000
2012-01-31 07:30:00  1.252340e+12               1.0    5.209561     30.000000
2012-01-31 07:30:00  1.252340e+12               2.0    5.766184      1.000000
2012-01-31 07:40:00  1.252340e+12               2.0    5.849411      2.500000
2012-01-31 07:50:00  1.252340e+12               2.0    5.932638      4.000000
2016-11-24 17:00:00  2.775153e+14               1.0    1.673716     17.000000
2016-11-24 17:10:00  2.775153e+14               1.0    1.357529     71.600001
2016-11-24 17:20:00  2.775153e+14               1.0    1.041343    126.200002
2016-11-24 17:30:00  2.775153e+14               1.0    0.571624    149.150003
2016-11-24 17:40:00  2.775153e+14               1.0    0.418093    117.500003

Python相关问答推荐

Polars比较了两个预设-有没有方法在第一次不匹配时立即失败

numba jitClass,记录类型为字符串

不理解Value错误:在Python中使用迭代对象设置时必须具有相等的len键和值

我们可以为Flask模型中的id字段主键设置默认uuid吗

把一个pandas文件夹从juyter笔记本放到堆栈溢出问题中的最快方法?

计算每个IP的平均值

提取相关行的最快方法—pandas

如何并行化/加速并行numba代码?

Python逻辑操作作为Pandas中的条件

用砂箱开发Web统计分析

如何在达到end_time时自动将状态字段从1更改为0

python中csv. Dictreader. fieldname的类型是什么?'

在pandas/python中计数嵌套类别

合并与拼接并举

当条件满足时停止ODE集成?

Django在一个不是ForeignKey的字段上加入'

替换包含Python DataFrame中的值的<;

VSCode Pylance假阳性(?)对ImportError的react

将Pandas DataFrame中的列名的长文本打断/换行为_STRING输出?

为什么这个正则表达式没有捕获最后一次输入?