选择每个日期的上一个时间戳

时间:2017-06-15 14:03:20

标签: python pandas multidimensional-array

数据帧每天只包含几个时间戳,我需要为每个日期选择最新的时间戳(而不是值,时间戳本身)。 df看起来像这样:

                               A      B      C
2016-12-05 12:00:00+00:00  126.0   15.0  38.54
2016-12-05 16:00:00+00:00  131.0   20.0  42.33
2016-12-14 05:00:00+00:00  129.0   18.0  43.24
2016-12-15 03:00:00+00:00  117.0   22.0  33.70
2016-12-15 04:00:00+00:00  140.0   23.0  34.81
2016-12-16 03:00:00+00:00  120.0   21.0  32.24
2016-12-16 04:00:00+00:00  142.0   22.0  35.20

我设法通过定义以下功能来实现我所需要的:

def find_last_h(df,column):
    newindex = []
    df2 = df.resample('d').last().dropna()
    for x in df2[column].values:
        newindex.append(df[df[column]==x].index.values[0])
    return pd.DatetimeIndex(newindex)

我用它来指定哪些列的值用作过滤器以获得所需的时间戳。这里的问题是在非唯一值的情况下,这可能无法按预期工作。

另一种使用方式是:

  grouped = df.groupby([df.index.day,df.index.hour])
  grouped.groupby(level=0).last()

然后重新构建时间戳,但它更加冗长。什么是聪明的方式?

3 个答案:

答案 0 :(得分:4)

使用由boolean indexingduplicated创建的掩码floor来截断times

idx = df.index.floor('D')
df = df[~idx.duplicated(keep='last') | ~idx.duplicated(keep=False)]
print (df)
                         A     B      C
2016-12-05 16:00:00  131.0  20.0  42.33
2016-12-14 05:00:00  129.0  18.0  43.24
2016-12-15 04:00:00  140.0  23.0  34.81
2016-12-16 04:00:00  142.0  22.0  35.20

reset_index + set_index的另一种解决方案:

df = df.reset_index().groupby([df.index.date]).last().set_index('index')
print (df)
                         A     B      C
index                                  
2016-12-05 16:00:00  131.0  20.0  42.33
2016-12-14 05:00:00  129.0  18.0  43.24
2016-12-15 04:00:00  140.0  23.0  34.81
2016-12-16 04:00:00  142.0  22.0  35.20

resamplegroupby dates只丢失了几次:

print (df.resample('1D').last().dropna())
                A     B      C
2016-12-05  131.0  20.0  42.33
2016-12-14  129.0  18.0  43.24
2016-12-15  140.0  23.0  34.81
2016-12-16  142.0  22.0  35.20

print (df.groupby([df.index.date]).last())
                A     B      C
2016-12-05  131.0  20.0  42.33
2016-12-14  129.0  18.0  43.24
2016-12-15  140.0  23.0  34.81
2016-12-16  142.0  22.0  35.20

答案 1 :(得分:0)

怎么样? df.resample('24H',kind='period').last().dropna()

答案 2 :(得分:0)

您可以按日期分组,只需取每个日期时间的 max 即可获得每个日期的最后一个日期时间。

这可能看起来像:

df.groupby(df["datetime"].dt.date)["datetime"].max()

或类似的东西

df.groupby(pd.Grouper(freq='D'))["datetime"].max()