在循环中使用 timedelta
Using timedelta in loop
我在数据框中有两列 min_date 和 max_date,其中每一行对应一个独特的产品和 3 个级别的产品层次结构(产品组),我计算了它们之间的区别找出中间的天数 (date_diff)。现在,我想看看有多少产品落在不同的桶中。说,第 04 组有多少产品 date_diff 超过 180 天,第 04 组有多少产品 date_diff 超过 150 天且少于 180 天..等等我会有7 桶 date_diff 从 0-30 天差异到超过 180 天差异。
我正在尝试以下代码:
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
我收到这个错误:
'>' not supported between instances of 'Timedelta' and 'int'
我的数据框看起来像这样
编辑:关于你的附加问题:
示例数据框(简化 - 请始终在您的问题中添加可以复制的小示例,而不是屏幕截图):
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
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
-列:
buckets = list(range(0, 181, 50)) + [df.date_diff.max().days + 1]
cut = pd.cut(df.date_diff.dt.days, buckets, right=False)
然后,第二步,做
result = df.groupby(['code_1', cut]).prod_loc.count().unstack(1)
产生
date_diff [0, 50) [50, 100) [100, 150) [150, 226)
code_1
01 2 2 1 0
02 0 0 1 4
或
result = df.groupby(['code_1', 'code_2', cut]).prod_loc.count().unstack(2)
产生
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
。
你也可以试试
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 方法。例如,对于
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)
min_date max_date date_diff
0 2021-07-21 2021-10-21 92 days
1 2021-07-22 2022-07-22 365 days
这个
check_df = max_days_by_order.date_diff.where(
max_days_by_order.date_diff.dt.days > 180
)
生产
0 NaT
1 365 days
Name: date_diff, dtype: timedelta64[ns]
这似乎是您要实现的目标? (我没有完整的图片,所以我可能错过了一些东西。)
我在数据框中有两列 min_date 和 max_date,其中每一行对应一个独特的产品和 3 个级别的产品层次结构(产品组),我计算了它们之间的区别找出中间的天数 (date_diff)。现在,我想看看有多少产品落在不同的桶中。说,第 04 组有多少产品 date_diff 超过 180 天,第 04 组有多少产品 date_diff 超过 150 天且少于 180 天..等等我会有7 桶 date_diff 从 0-30 天差异到超过 180 天差异。
我正在尝试以下代码:
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
我收到这个错误:
'>' not supported between instances of 'Timedelta' and 'int'
我的数据框看起来像这样
编辑:关于你的附加问题:
示例数据框(简化 - 请始终在您的问题中添加可以复制的小示例,而不是屏幕截图):
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
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
-列:
buckets = list(range(0, 181, 50)) + [df.date_diff.max().days + 1]
cut = pd.cut(df.date_diff.dt.days, buckets, right=False)
然后,第二步,做
result = df.groupby(['code_1', cut]).prod_loc.count().unstack(1)
产生
date_diff [0, 50) [50, 100) [100, 150) [150, 226)
code_1
01 2 2 1 0
02 0 0 1 4
或
result = df.groupby(['code_1', 'code_2', cut]).prod_loc.count().unstack(2)
产生
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
。
你也可以试试
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 方法。例如,对于
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)
min_date max_date date_diff
0 2021-07-21 2021-10-21 92 days
1 2021-07-22 2022-07-22 365 days
这个
check_df = max_days_by_order.date_diff.where(
max_days_by_order.date_diff.dt.days > 180
)
生产
0 NaT
1 365 days
Name: date_diff, dtype: timedelta64[ns]
这似乎是您要实现的目标? (我没有完整的图片,所以我可能错过了一些东西。)