熊猫如何在特定日期和日期范围内的总和值之间重新采样?

崩溃

(此问题是如何以7d频率使用pandas Grouper并用0填充缺失天的后续操作

我有以下数据框

df = pd.DataFrame({
    'names': ['joe', 'joe', 'joe'],
    'dates': [dt.datetime(2019,6,1), dt.datetime(2019,6,5), dt.datetime(2019,7,1)],
    'start_date': dt.datetime(2019,5,1),
    'end_date': dt.datetime(2019,7,5),
    'values': [5,2,13]
})

  names      dates start_date   end_date  values
0   joe 2019-06-01 2019-05-01 2019-07-05       5
1   joe 2019-06-05 2019-05-01 2019-07-05       2
2   joe 2019-07-01 2019-05-01 2019-07-05      13

我想在7天的数据块中对数据进行重新采样,日期范围由start_date定义end_date

通过使用以下变通办法,我能够实现所需的结果

temp_df = pd.DataFrame({
    'dates': [df.start_date.tolist()[0], dt.end_date.tolist()[0]],
    'names': df.names.tolist()[0],
    'values': 0
})

concat_df = pd.concat([df, temp_df], axis=0, sort=True)

concat_df.set_index('dates').groupby('names').resample('7D').sum()

哪个输出

                  values
names dates             
joe   2019-05-01       0
      2019-05-08       0
      2019-05-15       0
      2019-05-22       0
      2019-05-29       5
      2019-06-05       2
      2019-06-12       0
      2019-06-19       0
      2019-06-26      13
      2019-07-03       0

这就是我想要的。

我敢肯定,有更好的方法可以实现这一目标。你有什么建议吗?

谢谢!

爱德华

您只需要为当前时间序列重新编制索引,就可以避免pd.concat产生更好的结果。

df.set_index('dates', inplace=True)
def groupbyResample(groupby):
    date_range = pd.date_range(groupby.start_date.min(), groupby.end_date.max(), 
                               freq='d', name='date_index')

    return date_range.to_frame(name='dates').join(groupby).resample('7D')['values'].sum()

df.groupby('names').apply(groupbyResample).stack()

结果:

names  date_index
joe    2019-05-01     0.0
       2019-05-08     0.0
       2019-05-15     0.0
       2019-05-22     0.0
       2019-05-29     5.0
       2019-06-05     2.0
       2019-06-12     0.0
       2019-06-19     0.0
       2019-06-26    13.0
       2019-07-03     0.0
dtype: float64

使用魔术功能%%timeit

%%timeit
def groupbyResample(groupby):
..
7.9 ms ± 352 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

您的方法:

%%timeit
temp_df = pd.DataFrame({ ..
9.1 ms ± 394 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

性能提升不多,但是,使用函数确实可以很好地扩展,并且您自己不会编写很多代码。话虽如此,我仍然觉得还有一种更惯用的方式来做到这一点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在特定日期范围内对熊猫列DataFrame中的某些值求和

如何找到特定日期范围内的最小值和最大值

SQL:特定日期范围内的计数/总和列

熊猫在特定日期之前重新采样

如果在特定日期范围内值相同,则熊猫删除行

Spark SQL-如何对链接到特定日期的日期范围内的值求和

如何计算日期范围内的特定日期和时间

如何在自定义Excel日历中的特定日期和时间范围内进行特定活动

在DataFrame中获取特定日期范围内的最小值和最大值

大熊猫-在特定日期范围内划分日期范围

如何在特定日期的特定时间范围内显示不同的消息

如何在 SQL Server 中查询特定日期范围内的数据

动态日期范围内的总和值

从由日期行组成的表中,如何计算日期在特定日期范围内的行数

日期之间的JavaScript过滤以获取特定日期范围内的记录

使用JavaScript获取日期范围内的特定日期

选择日期范围内的特定日期

获取特定日期范围内熊猫的平均值

如何在python熊猫中的特定范围内检查日期时间列?

两个相关表之间的SQL SELECT数据不在特定日期范围内

如何获取给定日期时间范围内的熊猫数据?

如何重新采样直到满足特定日期标准

在特定日期范围内合并Pandas DataFrame

knex:选择特定日期范围内的行

SQL选择特定日期范围内的生日

无法获取在特定日期范围内创建的工件

获取特定日期范围内的结果

计算特定日期范围内MySQL中每行值的百分比

如果观察值不在相邻列的特定日期范围内,我希望消除它们