如何消除 TimeDelta 计算中的歧义?

问题描述 投票:0回答:1

我有一组非常简单的代码,我正在尝试根据时间增量生成结果。

currentdate = datetime.datetime.now()
currentdate = currentdate.strftime("%m/%d/%Y")
##I need this first bit for another portion of my code, so it's a little messy.
now = datetime.date.today()
now = datetime.datetime.strptime(currentdate,'%m/%d/%Y').date()
now = pd.to_datetime(now)
delta1 = timedelta(days=30)
delta2 = timedelta(days=59)
delta3 = timedelta(days=180)
outdated = timedelta(days=1)
Line_Down = pd.to_datetime(fulldf['Line_Down'])

在此之后,我将每一列设置为告诉我“Line_Down”列是否距当前日期一定天数,从而生成 TRUE 或 FALSE 值。我从日期中删除了时间以使内容更具可读性。

dateout = Line_Down - now
fulldf['Priority1'] = (delta1 >= dateout)
fulldf['Priority2'] = (delta2 >= dateout)
fulldf['Priority3'] = (delta3 >= dateout)

这是我必须检查 TRUE/FALSE 的代码,这显然不起作用。

fulldf['Priority1'] = fulldf['Priority1'].apply(lambda x: str(x))
if (fulldf['Priority1']) == 'FALSE':
    fulldf['Priority'] = '1'

“优先级”列只是根据“Line_Down”日期距当前日期的距离设置一个数字。然而Python不承认“Priority1-3”为布尔值,所以我无法用任何语句解析它。它指出(正如我确定您已经预料到的那样):

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

编辑:我知道它试图立即处理整个列,这造成了歧义。我如何让它单独查看每一行,以解决歧义?

如何将其转换为字符串或布尔值来处理它?原始的 TRUE/FALSE 值对我来说毫无价值,但这似乎就是我能够从 TimeDelta 计算中获得的全部内容。

python pandas dataframe timedelta
1个回答
0
投票

您可以使用

numpy.where
函数来执行您尝试实现的操作。

以下是您在问题背景下如何使用它的方法:

import numpy as np


fulldf['Priority'] = np.where(fulldf['Priority1']==False,  1,  0)
#                             ^-------------------------^ ^-^ ^-^
#                             |                           |   |
#                             |                           |   +-- [Optional] Add the value 
#                             |                           |       you want to set when
#                             |                           |        the condition is False
#                             |                           |
#                             |                           +-- Add the value you
#                             |                               want to set when
#                             |                               the condition is True
#                             |
#                             +-- Set the condition you want to
#                                 check.
print(fulldf)
# Prints:
#
#    Line_Down Priority1  Priority2  Priority3  Priority
# 0 2023-01-06      True       True       True         0
# 1 2023-01-07      True       True       True         0
# 2 2023-01-08      True       True       True         0
线_下 优先1 优先2 优先级3 优先
2023-01-06 00:00:00 正确 正确 正确 0
2023-01-07 00:00:00 正确 正确 正确 0
2023-01-08 00:00:00 正确 正确 正确 0

注意事项

np.where
函数的工作原理是接受一个条件和两个值,这两个值表示条件为真或假时要设置的值。 使用此功能的优点是它可以很好地与 pandas 的数据框和系列配合使用。 该函数也很高效,因为它是矢量化的,这意味着它可以一次处理整个数组。

© www.soinside.com 2019 - 2024. All rights reserved.