Python使用if函数:ValueError:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()

Python使用if函数:ValueError:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all(),python,datetime,if-statement,Python,Datetime,If Statement,我知道以前有人问过这个问题,但每个案例都不同。。。我的请求是: df=pd.read\u csv('file.csv')) #将字符串转换为datetime对象 时间=pd.to_日期时间(df.dttm_utc) 月=time.dt.Month Day=time.dt.Day 小时=time.dt.Hour InDayLightSavings=真 如果(月=2):InDayLightSavings=False 如果(IndayLightSaves): time=time-datetime.t

我知道以前有人问过这个问题,但每个案例都不同。。。我的请求是:

df=pd.read\u csv('file.csv'))
#将字符串转换为datetime对象
时间=pd.to_日期时间(df.dttm_utc)
月=time.dt.Month
Day=time.dt.Day
小时=time.dt.Hour
InDayLightSavings=真
如果(月=2):InDayLightSavings=False
如果(IndayLightSaves):

time=time-datetime.timedelta(小时=1)
用&代替and怎么样

or和python语句需要真值。 我们这样做是因为在pandas中这些被认为是不明确的,所以我们应该使用位运算符“|”(or)或“&”(and)操作

if (Month<3): InDayLightSavings=False
if (Month==3) & (Day<11) & (Hour<2): InDayLightSavings=False
if (Month>11): InDayLightSavings=False
if (Month==11) & (Day>4) & (Hour>=2): InDayLightSavings=False
if(月=2):InDayLightSavings=False

(注:我本可以对此发表评论,但没有这样做的声誉。)

您看到的例外情况是,您试图根据一组单一条件对包含许多不同条目的系列进行评估。 简单地说,让我们看看你在做什么:

错误分析(为什么不这样做):

首先,您确实获取了一个dataframe列,然后将其转换为datetime,当然它也会返回一个列(序列)

您的错误:然后您尝试评估系列中的特定条件:

但是,您不能将单个条件与系列进行比较,至少不能这样。Python不知道您指的是该系列中的哪个条目,因为其中的某些值可能与其他值不同。这意味着,对于系列中的某些项目,可能满足条件,而对于其他项目,则不满足条件。因此,
ValueError:序列的真值是不明确的

您想做什么:

逐项评估,最好是以矢量化的方式。我的建议:始终保持在熊猫数据框中:

df['Datetime'] = pd.to_datetime(df['dttm_utc']) # Add second column with datetime format
df['Month'] = df.Datetime.dt.month     # Extract month and add to new column
                                                # Same for day
df.loc[(df.Month < 3), 'InDayLightSavings'] = False 
# You can add multiple conditions here
# Finally, your filter:
df.loc[(df.InDayLightSavings == True), 'Time'] = df['Time'] - dt.timedelta(hours=1) 
# dt when import datetime as dt, else just datetime
df['Datetime']=pd.to_Datetime(df['dttm_utc'])#使用Datetime格式添加第二列
df['Month']=df.Datetime.dt.Month#提取月份并添加到新列
#今天也一样
df.loc[(df.Month<3),“InDayLightSavings”]=假
#您可以在此处添加多个条件
#最后,您的过滤器:
df.loc[(df.InDayLightSavings==True),'Time']=df['Time']-dt.timedelta(小时=1)
#将datetime导入为dt时的dt,否则只导入datetime

进一步读取和。

和所需的输出将是?与原始数据相比,它将datetime IndayLightSaveing范围更改为+1小时。想象一下,你在12年11月3日(夏时制日)将时钟从凌晨2点拨到凌晨3点。我的意思是,如果你在问题中包含了所需的输出(就像你包含了输入一样),这会很有帮助。只是为了让回答者知道你到底想要什么。谢谢!我尝试了它,现在它显示了TypeError的新错误:无法将类型“Period”与类型“int”进行比较?现在的问题是它没有运行if语句:“if('InDaylightSavings'):df.Datetime=df.Datetime+Datetime.timedelta(hours=1)”。它将所有Datetime小时更改为+1,但不更改特定的子集?这是因为您的if语句错误-请参阅代码编辑。看起来它正常工作。现在我只需要把复杂的标准串起来。。。虽然我还没有做到,但我会努力的。非常感谢。快乐编码!很乐意帮忙。嘿,谢谢。我以前试过,但没有像我在问题中说的那样奏效:)
if (Month == whatever_condition): 
    do_something()
df['Datetime'] = pd.to_datetime(df['dttm_utc']) # Add second column with datetime format
df['Month'] = df.Datetime.dt.month     # Extract month and add to new column
                                                # Same for day
df.loc[(df.Month < 3), 'InDayLightSavings'] = False 
# You can add multiple conditions here
# Finally, your filter:
df.loc[(df.InDayLightSavings == True), 'Time'] = df['Time'] - dt.timedelta(hours=1) 
# dt when import datetime as dt, else just datetime