首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按日期范围从变量中计算累积提取量(求和)

按日期范围从变量中计算累积提取量(求和)
EN

Stack Overflow用户
提问于 2022-11-24 09:41:31
回答 2查看 34关注 0票数 2

让它成为下面的蟒蛇熊猫DataFrame,每一行代表一个人在酒店的停留。

代码语言:javascript
复制
| entry_date | exit_date  | days   | other_columns |
| ---------- | ---------- | ------ | ------------- |
| 2022-02-01 | 2022-02-05 | 5      |  ...          |
| 2022-02-02 | 2022-02-03 | 2      |  ...          |
| 2022-04-10 | 2022-04-13 | 4      |  ...          |
| 2022-04-11 | 2022-04-12 | 2      |  ...          |
| 2022-04-12 | 2022-04-13 | 2      |  ...          |
| 2022-11-10 | 2022-11-15 | 6      |  ...          |

我想做一个DataFrame,从上一个,在那里它代表了每天,酒店的入住率。我不考虑夜晚,只考虑白天的变化。

代码语言:javascript
复制
| date       | ocupation  |
| ---------- | ---------- |
| 2022-02-01 |     1      |
| 2022-02-02 |     2      |
| 2022-02-03 |     2      |
| 2022-02-04 |     1      |
| 2022-02-05 |     1      |
| 2022-04-10 |     1      |
| 2022-04-11 |     2      |
| 2022-04-12 |     3      |
| 2022-04-13 |     2      |
| 2022-11-10 |     1      |
| 2022-11-11 |     1      |
| 2022-11-12 |     1      |
| 2022-11-13 |     1      |
| 2022-11-14 |     1      |
| 2022-11-15 |     1      |
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-24 09:50:32

使用:

代码语言:javascript
复制
#convert column to datetimes
df['entry_date'] = pd.to_datetime(df['entry_date'])

#repeat rows by days column
df = df.loc[df.index.repeat(df['days'])]

#create days timedeltas
td = pd.to_timedelta(df.groupby(level=0).cumcount(), unit='d')

#add timedeltas by datetiems and count to 2 columns DataFrame
df1 = (df['entry_date'].add(td)
                       .value_counts()
                       .sort_index()
                       .rename_axis('date')
                       .reset_index(name='ocupation'))
print (df1)

         date  ocupation
0  2022-02-01         1
1  2022-02-02         2
2  2022-02-03         2
3  2022-02-04         1
4  2022-02-05         1
5  2022-04-10         1
6  2022-04-11         2
7  2022-04-12         3
8  2022-04-13         2
9  2022-11-10         1
10 2022-11-11         1
11 2022-11-12         1
12 2022-11-13         1
13 2022-11-14         1
14 2022-11-15         1

Performance:重复1000次的示例数据:

代码语言:javascript
复制
df = pd.concat([df] * 1000, ignore_index=True)

def jez(df):
    #convert column to datetimes
    df['entry_date'] = pd.to_datetime(df['entry_date'], dayfirst=True)
    
    #repeat rows by days column
    df = df.loc[df.index.repeat(df['days'])]
    
    #create days timedeltas
    td = pd.to_timedelta(df.groupby(level=0).cumcount(), unit='d')
    
    #add timedeltas by datetiems and count to 2 columns DataFrame
    return (df['entry_date'].add(td)
                           .value_counts()
                           .sort_index()
                           .rename_axis('date')
                           .reset_index(name='ocupation'))
    


def moz(df):
    return (pd.Series([d for start, end in zip(df['entry_date'], df['exit_date'])
            for d in pd.date_range(start, end, freq='D')], name='date')
   .value_counts(sort=False)
   .reset_index(name='ocupation')
 )

代码语言:javascript
复制
In [122]: %timeit jez(df)
15.3 ms ± 470 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [123]: %timeit moz(df)
2.31 s ± 140 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
票数 3
EN

Stack Overflow用户

发布于 2022-11-24 09:55:32

您可以使用date_rangevalue_counts

代码语言:javascript
复制
# ensure datetime
# for year-day-month
df[['entry_date', 'exit_date']] = df[['entry_date', 'exit_date']].apply(pd.to_datetime, dayfirst=True)
# for year-month-day
df[['entry_date', 'exit_date']] = df[['entry_date', 'exit_date']].apply(pd.to_datetime, dayfirst=False)


(pd.Series([d for start, end in zip(df['entry_date'], df['exit_date'])
            for d in pd.date_range(start, end, freq='D')], name='date')
   .value_counts(sort=False)
   .reset_index(name='ocupation')
)

输出:

代码语言:javascript
复制
        index  ocupation
0  2022-02-01          1
1  2022-02-02          2
2  2022-02-03          2
3  2022-02-04          1
4  2022-02-05          1
5  2022-04-10          1
6  2022-04-11          2
7  2022-04-12          3
8  2022-04-13          2
9  2022-11-10          1
10 2022-11-11          1
11 2022-11-12          1
12 2022-11-13          1
13 2022-11-14          1
14 2022-11-15          1
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74558578

复制
相关文章

相似问题

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