首页 > 解决方案 > 每晚重采样 DataFrame

问题描述

我有一个标记事件的 DataFrame。我需要计算每晚这些事件的数量,例如晚上 19​​:00 之后到早上 08:00 之前。

我正在考虑使用count(),但我的困难在于夜间切换日期。

我不想要df.resample("d").count(),因为这将计算每个日历日的所有事件,即 00::00 到 24:00。我想要从 19:00 到第二天 08:00 的所有事件。

这里的示例代码将在随机时间每晚生成 80 到 120 个事件:

np.random.seed(843)
rand_times = []
for i in range(5):
    rand_times.extend([datetime.datetime(2015,8,i+12,20,0,0) + pd.Timedelta(k, unit="m") for k in np.random.randint(600, size=np.random.randint(low=80, high=120))])
rand_times.sort()
df = pd.DataFrame(["1234"]*len(rand_times), index=rand_times, columns=["participant_ID"])

df.head()
    participant_ID
2015-08-12 20:02:00     1234
2015-08-12 20:12:00     1234
2015-08-12 20:15:00     1234
2015-08-12 20:19:00     1234
2015-08-12 20:21:00     1234

到目前为止,我所做的是每晚手动访问,通过循环访问它们:

for i in range(5):
    print(df.loc[(df.index >= datetime.datetime(2015,8,12+i,20,0,0)) & (df.index <= datetime.datetime(2015,8,12+i+1,8))].count())

participant_ID    115
dtype: int64
participant_ID    90
dtype: int64
participant_ID    110
dtype: int64
participant_ID    114
dtype: int64
participant_ID    87
dtype: int64

有没有更简单的方法来做到这一点?我需要进一步处理这些信息,计算每晚每小时的事件数等。

任何帮助表示赞赏!

标签: python-3.xpandasdataframe

解决方案


我找到了一个适合我的解决方案,使用多索引。基于上面给出的示例代码。

df_new = []
for i in range(5):
    # iterates through every night
    snipped = df.index[(df.index >= datetime.datetime(2015,8,12+i,20,0,0)) & (df.index <= datetime.datetime(2015,8,12+i+1,8))]
    for row in snipped:
        df_new.append((snipped[0].date(), row))

# create MultiIndex object
myindex = pd.MultiIndex.from_tuples(df_new, names=["day", "time"])
# create new DataFrame using this multi index
DF = pd.DataFrame(list(df["participant_ID"]), index=myindex, columns=["participant_id"])

# access by night ( first level of multi index)
DF.groupby(pd.Grouper(level=0)).count()

day     
2015-08-12  115
2015-08-13  90
2015-08-14  110
2015-08-15  114
2015-08-16  87

我是多索引的新手,很高兴能改进这个建议。


推荐阅读