我有一组非常简单的代码,我正在尝试根据时间增量生成结果。
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 计算中获得的全部内容。
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 的数据框和系列配合使用。
该函数也很高效,因为它是矢量化的,这意味着它可以一次处理整个数组。