首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将熊猫的每周数据转换为每日数据?

如何将熊猫的每周数据转换为每日数据?
EN

Stack Overflow用户
提问于 2020-01-22 09:39:30
回答 1查看 941关注 0票数 1

我有以下数据

代码语言:javascript
运行
复制
import pandas as pd
foo = pd.DataFrame({'date':['2019-09-30', '2019-10-07', '2019-09-30', '2019-10-07'], 'sales': [7, 14, 28, 35], 'country': ['a', 'a', 'b', 'b']})

date值按country每周变化一次。

我希望扩展此数据,以便date列按国家进行每日更改,日报 sales值为周刊 sales值除以7。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-22 09:42:17

DataFrameGroupBy.resampleResampler.ffill一起使用,并将值除以7,还必须按国家添加最后重复的行,并添加6天,以避免每组忽略上周的最后几天:

代码语言:javascript
运行
复制
foo['date'] = pd.to_datetime(foo['date'])

mask = foo['country'].duplicated(keep='last')
foo1 = foo[~mask].assign(date = lambda x: x['date'] + pd.Timedelta(6, unit='d'))
foo = foo.append(foo1, ignore_index=True)
print (foo)
        date  sales country
0 2019-09-30      7       a
1 2019-10-07     14       a
2 2019-09-30     28       b
3 2019-10-07     35       b
4 2019-10-13     14       a
5 2019-10-13     35       b

如果没有对每个组的日期时间进行排序,则可以使用以下替代方法:

代码语言:javascript
运行
复制
foo1 = (foo.loc[foo.groupby('country')['date'].idxmax()]
            .assign(date = lambda x: x['date'] + pd.Timedelta(6, unit='d')))
foo = foo.append(foo1, ignore_index=True)
print (foo)
        date  sales country
0 2019-09-30      7       a
1 2019-10-07     14       a
2 2019-09-30     28       b
3 2019-10-07     35       b
4 2019-10-13     14       a
5 2019-10-13     35       b

代码语言:javascript
运行
复制
df = (foo.set_index('date')
         .groupby('country')['sales']
         .resample('d')
         .ffill()
         .div(7)
         .reset_index()
         )

代码语言:javascript
运行
复制
print (df)
   country       date  sales
0        a 2019-09-30    1.0
1        a 2019-10-01    1.0
2        a 2019-10-02    1.0
3        a 2019-10-03    1.0
4        a 2019-10-04    1.0
5        a 2019-10-05    1.0
6        a 2019-10-06    1.0
7        a 2019-10-07    2.0
8        a 2019-10-08    2.0
9        a 2019-10-09    2.0
10       a 2019-10-10    2.0
11       a 2019-10-11    2.0
12       a 2019-10-12    2.0
13       a 2019-10-13    2.0
14       b 2019-09-30    4.0
15       b 2019-10-01    4.0
16       b 2019-10-02    4.0
17       b 2019-10-03    4.0
18       b 2019-10-04    4.0
19       b 2019-10-05    4.0
20       b 2019-10-06    4.0
21       b 2019-10-07    5.0
22       b 2019-10-08    5.0
23       b 2019-10-09    5.0
24       b 2019-10-10    5.0
25       b 2019-10-11    5.0
26       b 2019-10-12    5.0
27       b 2019-10-13    5.0

如果不是必要的,请添加最后一行:

代码语言:javascript
运行
复制
foo['date'] = pd.to_datetime(foo['date'])

df1 = (foo.set_index('date')
          .groupby('country')['sales']
          .resample('d')
          .ffill()
          .div(7)
          .reset_index()
         )
print (df1)
   country       date  sales
0        a 2019-09-30    1.0
1        a 2019-10-01    1.0
2        a 2019-10-02    1.0
3        a 2019-10-03    1.0
4        a 2019-10-04    1.0
5        a 2019-10-05    1.0
6        a 2019-10-06    1.0
7        a 2019-10-07    2.0
8        b 2019-09-30    4.0
9        b 2019-10-01    4.0
10       b 2019-10-02    4.0
11       b 2019-10-03    4.0
12       b 2019-10-04    4.0
13       b 2019-10-05    4.0
14       b 2019-10-06    4.0
15       b 2019-10-07    5.0
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59856609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档