首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用timedelta in循环

使用timedelta in循环
EN

Stack Overflow用户
提问于 2021-07-22 07:23:20
回答 1查看 304关注 0票数 0

我在dataframe中有两个列-- min_date和max_date,其中每一行对应于一个独特的产品和3个产品层次结构(产品组),我利用它们之间的差异来找出两者之间的天数(Date_diff)。现在,我想看看有多少产品落在不同的桶里。比方说,04组有多少产品的date_diff超过180天,有多少产品的date_diff超过150天,小于180天的..and等等,我将有7桶的date_diff,从0-30天的差异到180天以上的差异。

我正在尝试以下代码:

代码语言:javascript
复制
    check_df=pd.DataFrame()
    for i in range(0,170331) :
         if (max_days_by_order.date_diff[i] > 160) :
                check_df[i] =  max_days_by_order.iloc[i]
        
    check_df  

我得到了这个错误:

‘>“Timedelta”和“int”实例之间不支持

我的数据看起来像这样

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-22 09:22:37

编辑:关于您的附加问题:

示例dataframe (简化--请始终在问题中添加一些可以复制的小示例,而不是屏幕截图):

代码语言:javascript
复制
df = pd.DataFrame({
    'prod_loc': range(10),
    'code_1': ['01'] * 5 + ['02'] * 5,
    'code_2': ['001'] * 3 + ['002'] * 3 + ['003'] * 4,
    'min_date': pd.to_datetime(['2021-07-22'] * 10),
    'max_date': pd.date_range('2021-07-22', periods=10, freq='25d')
})
df['date_diff'] = df.max_date - df.min_date
代码语言:javascript
复制
   prod_loc code_1 code_2   min_date   max_date date_diff
0         0     01    001 2021-07-22 2021-07-22    0 days
1         1     01    001 2021-07-22 2021-08-16   25 days
2         2     01    001 2021-07-22 2021-09-10   50 days
3         3     01    002 2021-07-22 2021-10-05   75 days
4         4     01    002 2021-07-22 2021-10-30  100 days
5         5     02    002 2021-07-22 2021-11-24  125 days
6         6     02    003 2021-07-22 2021-12-19  150 days
7         7     02    003 2021-07-22 2022-01-13  175 days
8         8     02    003 2021-07-22 2022-02-07  200 days
9         9     02    003 2021-07-22 2022-03-04  225 days

第一步:设置桶(您可以选择其他桶)和pd.cut-ing diff_days-column:

代码语言:javascript
复制
buckets = list(range(0, 181, 50)) + [df.date_diff.max().days + 1]
cut = pd.cut(df.date_diff.dt.days, buckets, right=False)

然后,第二步,做

代码语言:javascript
复制
result = df.groupby(['code_1', cut]).prod_loc.count().unstack(1)

产额

代码语言:javascript
复制
date_diff  [0, 50)  [50, 100)  [100, 150)  [150, 226)
code_1                                               
01               2          2           1           0
02               0          0           1           4

代码语言:javascript
复制
result = df.groupby(['code_1', 'code_2', cut]).prod_loc.count().unstack(2)

产额

代码语言:javascript
复制
date_diff      [0, 50)  [50, 100)  [100, 150)  [150, 226)
code_1 code_2                                            
01     001           2          1           0           0
       002           0          1           1           0
       003           0          0           0           0
02     001           0          0           0           0
       002           0          0           1           0
       003           0          0           0           4

如果您喜欢更长的视图,则不需要unstack

你也可以试试

代码语言:javascript
复制
df['buckets'] = cut
result = df.pivot_table(index=['code_1'], columns='buckets',
                        values='prod_loc', aggfunc='count')
result = df.pivot_table(index=['code_1', 'code_2'], columns='buckets',
                        values='prod_loc', aggfunc='count')

这就是你要找的吗?

顺便说一句:不要重复数据格式,除非你必须这样做。使用本地Pandas方法。例如,对于

代码语言:javascript
复制
max_days_by_order = pd.DataFrame({
    'min_date': pd.to_datetime(['2021-07-21', '2021-07-22']),
    'max_date': pd.to_datetime(['2021-10-21', '2022-07-22'])
})
max_days_by_order['date_diff'] = (max_days_by_order.max_date
                                  - max_days_by_order.min_date)
代码语言:javascript
复制
    min_date   max_date date_diff
0 2021-07-21 2021-10-21   92 days
1 2021-07-22 2022-07-22  365 days

代码语言:javascript
复制
check_df = max_days_by_order.date_diff.where(
                max_days_by_order.date_diff.dt.days > 180
           )

产生

代码语言:javascript
复制
0        NaT
1   365 days
Name: date_diff, dtype: timedelta64[ns]

这似乎就是你想要达到的目标?(我没有完整的照片,所以我可能漏掉了什么。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68480734

复制
相关文章

相似问题

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