gpt4 book ai didi

Python Pandas DataFrame 根据周一至周日的每周定义将每日数据重新采样为一周?

转载 作者:太空宇宙 更新时间:2023-11-04 10:23:13 25 4
gpt4 key购买 nike

import pandas as pd
import numpy as np

dates = pd.date_range('20141229',periods=14, name='Day')
df = pd.DataFrame({'Sum1': [1667, 1229, 1360, 9232, 8866, 4083, 3671, 10085, 10005, 8730, 10056, 10176, 3792, 3518],
'Sum2': [91, 75, 75, 254, 239, 108, 99, 259, 395, 355, 332, 386, 96, 111],
'Sum3': [365.95, 398.97, 285.12, 992.17, 1116.57, 512.11, 504.47, 1190.96, 1753.6, 1646.25, 1344.05, 1582.67, 560.95, 736.44],
'Sum4': [5, 5, 1, 5, 8, 8, 2, 10, 12, 16, 16, 6, 6, 3]},index=dates); print(df)

生成的 df 如下所示:

             Sum1  Sum2     Sum3  Sum4
Day
2014-12-29 1667 91 365.95 5
2014-12-30 1229 75 398.97 5
2014-12-31 1360 75 285.12 1
2015-01-01 9232 254 992.17 5
2015-01-02 8866 239 1116.57 8
2015-01-03 4083 108 512.11 8
2015-01-04 3671 99 504.47 2
2015-01-05 10085 259 1190.96 10
2015-01-06 10005 395 1753.60 12
2015-01-07 8730 355 1646.25 16
2015-01-08 10056 332 1344.05 16
2015-01-09 10176 386 1582.67 6
2015-01-10 3792 96 560.95 6
2015-01-11 3518 111 736.44 3

假设我对 Dataframe 重新采样以尝试将每日数据汇总到每周行中:

df_resampled = df.resample('W', how='sum', label='left'); print(df_resampled)

这会产生以下内容:

             Sum1  Sum2     Sum3  Sum4
Day
2014-12-28 30108 941 4175.36 34
2015-01-04 56362 1934 8814.92 69

问题 1:我对一周的定义是周一至周日。由于我的数据从 2014-12-29(星期一)开始,我希望我的 Day label 也从那天开始。我如何使 Day index label 成为每个星期一而不是每个星期日的日期?

期望的输出:

             Sum1  Sum2     Sum3  Sum4
Day
2014-12-29 30108 941 4175.36 34
2015-01-05 56362 1934 8814.92 69

关于问题 1,我尝试了什么?

我将 'W' 更改为 'W-MON' 但它通过在 中计算 2014-12-29 产生了 3 行>2014-12-22 这不是我想要的行:

             Sum1  Sum2     Sum3  Sum4
Day
2014-12-22 1667 91 365.95 5
2014-12-29 38526 1109 5000.37 39
2015-01-05 46277 1675 7623.96 59

问题 2:如何将 Day index 标签格式化为看起来像一个范围?例如:

                         Sum1  Sum2     Sum3  Sum4
Day
2014-12-29 - 2015-01-04 30108 941 4175.36 34
2015-01-05 - 2015-01-11 56362 1934 8814.92 69

最佳答案

如果其他人不知道,事实证明每周 Anchored Offsets以结束日期为准。因此,默认情况下,只需重新采样“W”(与“W-SUN”相同)就是周一至周日的样本。列出的日期是结束日期。看这个old bug report其中文档和 API 均未更新。

鉴于您在 resample parameters 中指定了 label='left' ,你一定已经意识到了这个事实。这也是为什么使用“W-MON”没有达到预期效果的原因。令人困惑的是,左边界实际上并不在区间内。

因此,要显示期间的开始日期而不是结束日期,您可以在索引中添加一天。那意味着你会这样做:

df_resampled.index = df_resampled.index + pd.DateOffset(days=1)

为了完整起见,这里是您的原始数据,在开头添加了另一天(星期日)以显示分组确实是星期一到星期日:

import pandas as pd
import numpy as np

dates = pd.date_range('20141228',periods=15, name='Day')
df = pd.DataFrame({'Sum1': [10000, 1667, 1229, 1360, 9232, 8866, 4083, 3671, 10085, 10005, 8730, 10056, 10176, 3792, 3518],
'Sum2': [10000, 91, 75, 75, 254, 239, 108, 99, 259, 395, 355, 332, 386, 96, 111],
'Sum3': [10000, 365.95, 398.97, 285.12, 992.17, 1116.57, 512.11, 504.47, 1190.96, 1753.6, 1646.25, 1344.05, 1582.67, 560.95, 736.44],
'Sum4': [10000, 5, 5, 1, 5, 8, 8, 2, 10, 12, 16, 16, 6, 6, 3]},index=dates);
print(df)
df_resampled = df.resample('W', how='sum', label='left')
df_resampled.index = df_resampled.index - pd.DateOffset(days=1)
print(df_resampled)

这个输出:

             Sum1   Sum2      Sum3   Sum4
Day
2014-12-28 10000 10000 10000.00 10000
2014-12-29 1667 91 365.95 5
2014-12-30 1229 75 398.97 5
2014-12-31 1360 75 285.12 1
2015-01-01 9232 254 992.17 5
2015-01-02 8866 239 1116.57 8
2015-01-03 4083 108 512.11 8
2015-01-04 3671 99 504.47 2
2015-01-05 10085 259 1190.96 10
2015-01-06 10005 395 1753.60 12
2015-01-07 8730 355 1646.25 16
2015-01-08 10056 332 1344.05 16
2015-01-09 10176 386 1582.67 6
2015-01-10 3792 96 560.95 6
2015-01-11 3518 111 736.44 3

Sum1 Sum2 Sum3 Sum4
Day
2014-12-22 10000 10000 10000.00 10000
2014-12-29 30108 941 4175.36 34
2015-01-05 56362 1934 8814.92 69

我相信这就是您想要的问题 1。

更新

resample() 现在有一个loffset 参数允许您移动标签偏移量。因此,无需修改索引,只需像这样添加 loffset 参数即可:

df.resample('W', how='sum', label='left', loffset=pd.DateOffset(days=1))

另请注意 how=sum 现在已弃用,取而代之的是在 .resample() 的重采样器对象上使用 .sum()返回。因此,完全更新的调用将是:

df_resampled = df.resample('W', label='left', loffset=pd.DateOffset(days=1)).sum()

更新 1.1.0

方便的 loffset 参数从 1.1.0 版本开始被弃用。 documentation表示移位应该在重新采样之后完成。在这种特殊情况下,我相信这意味着这是正确的代码(未经测试):

from pandas.tseries.frequencies import to_offset
df_resampled = df.resample('W', label='left').sum()
df_resampled.index = df_resampled.index + to_offset(pd.DateOffset(days=1))

关于Python Pandas DataFrame 根据周一至周日的每周定义将每日数据重新采样为一周?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30989224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com