datetime64[ns] 的逻辑语句
Logical statement for datetime64[ns]
我在使用 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 中的第一个 运行 让我出错了。
下面是link下载示例数据文件:
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
我该如何纠正?
您正在将整个系列 s
应用于过滤后的数据框列。我认为使用 mask
或 np.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'))
.loc
如果您分配的是 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
我在使用 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 中的第一个 运行 让我出错了。
下面是link下载示例数据文件:
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
我该如何纠正?
您正在将整个系列 s
应用于过滤后的数据框列。我认为使用 mask
或 np.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'))
.loc
如果您分配的是 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