【问题标题】:Logical statement for datetime64[ns]datetime64[ns] 的逻辑语句
【发布时间】:2021-02-19 17:03:27
【问题描述】:

我在使用df.loc 时遇到以下错误。我有一个参数 s,它是 datetime64[ns],我有一个数据框,其中有两个列 MDT1 和 MTD2,它也是 datetime64[ns] 类型。当我使用 df.loc 使用以下语句时

s= df_1x2['date'].astype (str)+'-'+ df_1x2['Time'].astype(str)
s = pd.to_datetime(s)
df_1x2.loc[(s>df_1x2['MDT1'])&(s<df_1x2['MDT2']),'Morning']= s

代码的最后一行显示 Jupyter Notebook 中的以下错误

ValueError: Can only compare identically-labeled Series objects

但是,当我第二次运行时,它按预期工作。只是在 Jupyter Notebook 中的第一次运行让我遇到了错误。

以下是示例数据文件的下载链接:

Click here to download the sample data file

下面是代码:

s = pd.to_datetime(df['Date']).astype(str)+' '+df['Time.1'].astype(str)+':00'
df['Matchdate'] = pd.to_datetime (s)

d =np.reciprocal(df_1x2[['Home','Draw','Away']].astype(float))

df_1x2['Margin'] = d.sum(axis = 1)-1
df_1x2['Open_DT'] = df_1x2['date'].astype (str)+'-'+ df_1x2['Time'].astype(str)
df_1x2['Open_DT'] = pd.to_datetime(df_1x2['Open_DT'])
df_1x2['Open_DT1'] = df_1x2.groupby(['Match','Odds_Type'])['Open_DT'].transform(min)
s = df_1x2['Open_DT'] == df_1x2['Open_DT1']
df_1x2.loc[s,'Open'] ='Opening'


df_1x2['Current_DT'] = df_1x2['date'].astype (str)+'-'+ df_1x2['Time'].astype(str)
df_1x2['Current_DT'] = pd.to_datetime(df_1x2['Current_DT'])
df_1x2['Current_DT1'] = df_1x2.groupby(['Match','Odds_Type'])['Current_DT'].transform(max)
sc = df_1x2['Current_DT'] == df_1x2['Current_DT1']
df_1x2.loc[sc,'Current'] ='Current'
df_1x2.loc[df_1x2.Open == 'Opening','Current']='Opening'

df_1x2 ['morning Date'] = pd.Timestamp.today()
Time1 = '08:00:00'
Time2 = '11:00:00'
s = df_1x2['date'].astype (str)+'-'+ df_1x2['Time'].astype(str)
s = pd.to_datetime(s)
df_1x2.reset_index(drop = True, inplace = True)

df_1x2 ['morning Date'] = pd.to_datetime(df_1x2 ['morning Date']).dt.date
df_1x2['MDT1'] = pd.to_datetime(df_1x2['morning Date'].astype(str)+' '+Time1)


df_1x2['MDT2'] = pd.to_datetime(df_1x2['morning Date'].astype(str)+' '+Time2)

df_1x2 .reset_index(drop= True, inplace = True)



df_1x2.loc[(s>df_1x2['MDT1'])&(s<df_1x2['MDT2']),'Morning']= s

我该如何纠正它?

【问题讨论】:

  • 可以复制粘贴df_1x2
  • @wwnde 你的意思是整个数据框吗?
  • 如果您还没有找到解决方案,就只管解决问题
  • 我将上传csv文件并将代码粘贴到问题中。

标签: python pandas python-datetime pandas-loc


【解决方案1】:

您正在将整个系列 s 应用于过滤的数据框列。我认为使用masknp.where 而不是.loc 更容易:

df_1x2['Morning'] = df_1x2['Morning'].mask((s > df_1x2['MDT1']) & (s < df_1x2['MDT2']), s)

np.where:

df_1x2['Morning'] = np.where((s > df_1x2['MDT1']) & (s < df_1x2['MDT2']), s, df_1x2['Morning'])

如果该列尚不存在,则使用:

df_1x2['Morning'] = np.where((s > df_1x2['MDT1']) & (s < df_1x2['MDT2']), s, np.datetime64('NaT'))

如果您分配像10 这样的单个值而不是长度比过滤数据帧长的系列,则.loc 可以用于此用例。


问题是您在定义s 之后reset_index(),这意味着它与您的数据框无法比较:

s = pd.to_datetime(df['Date']).astype(str)+' '+df['Time.1'].astype(str)+':00'
df['Matchdate'] = pd.to_datetime (s)

d =np.reciprocal(df_1x2[['Home','Draw','Away']].astype(float))

df_1x2['Margin'] = d.sum(axis = 1)-1
df_1x2['Open_DT'] = df_1x2['date'].astype (str)+'-'+ df_1x2['Time'].astype(str)
df_1x2['Open_DT'] = pd.to_datetime(df_1x2['Open_DT'])
df_1x2['Open_DT1'] = df_1x2.groupby(['Match','Odds_Type'])['Open_DT'].transform(min)
s = df_1x2['Open_DT'] == df_1x2['Open_DT1']
df_1x2.loc[s,'Open'] ='Opening'


df_1x2['Current_DT'] = df_1x2['date'].astype (str)+'-'+ df_1x2['Time'].astype(str)
df_1x2['Current_DT'] = pd.to_datetime(df_1x2['Current_DT'])
df_1x2['Current_DT1'] = df_1x2.groupby(['Match','Odds_Type'])['Current_DT'].transform(max)
sc = df_1x2['Current_DT'] == df_1x2['Current_DT1']
df_1x2.loc[sc,'Current'] ='Current'
df_1x2.loc[df_1x2.Open == 'Opening','Current']='Opening'

df_1x2 ['morning Date'] = pd.Timestamp.today()
Time1 = '08:00:00'
Time2 = '11:00:00'

########### I moved s from here...........

df_1x2.reset_index(drop = True, inplace = True)

df_1x2 ['morning Date'] = pd.to_datetime(df_1x2 ['morning Date']).dt.date
df_1x2['MDT1'] = pd.to_datetime(df_1x2['morning Date'].astype(str)+' '+Time1)


df_1x2['MDT2'] = pd.to_datetime(df_1x2['morning Date'].astype(str)+' '+Time2)

df_1x2 .reset_index(drop= True, inplace = True)

########### .........to here. 
##### Resetting the  index after defining s, means you can no longer compare directly to your dataframe as s has a different index than your dataframe now.

s = df_1x2['date'].astype (str)+'-'+ df_1x2['Time'].astype(str)
s = pd.to_datetime(s)


df_1x2.loc[(s>df_1x2['MDT1'])&(s<df_1x2['MDT2']),'Morning']= s

【讨论】:

  • 嗨@David Erickson,不幸的是,在此步骤之前不存在“Morning”列,因此我也遇到了错误。我将附上包含数据的 csv 文件
  • @Zephyr 在您的情况之外,替代结果是什么?你刚才提到的是你的问题。您不能将基于带有条件的过滤数据框的列添加到数据框,因为长度不相等。例如,如果替代结果是np.nan,请查看我的更新答案。
  • 不幸的是,它仍然给了我同样的错误 ValueError: Can only compare same-labeled Series objects
  • 我认为它在两次新运行后有效。非常感谢。这意味着我仍然可以应用 df.loc 但索引在重置后会给我带来问题。
  • 非常感谢大卫。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-03
  • 1970-01-01
  • 2021-12-15
  • 2012-03-25
相关资源
最近更新 更多