Python 按日期显示特定列
我有一个dataframe(df),它有两个主列——一个称为'TIMESTAMP',表示日期,另一个称为'QC',反映质量控制标志,如int。这个df大约有40000行,所以我不想对每一行进行迭代 我有一个新的数据帧(dfNew),它只有两列,其中有几个开始日期对和结束日期对。我想查看我的原始df,对于时间戳位于dfNew中列出的任何开始-结束日期对之间的所有行,我想用-1替换QC值。这个dfNew大约有400行,所以我认为在这里迭代不会太糟糕 df看起来像这样:Python 按日期显示特定列,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个dataframe(df),它有两个主列——一个称为'TIMESTAMP',表示日期,另一个称为'QC',反映质量控制标志,如int。这个df大约有40000行,所以我不想对每一行进行迭代 我有一个新的数据帧(dfNew),它只有两列,其中有几个开始日期对和结束日期对。我想查看我的原始df,对于时间戳位于dfNew中列出的任何开始-结束日期对之间的所有行,我想用-1替换QC值。这个dfNew大约有400行,所以我认为在这里迭代不会太糟糕 df看起来像这样: TIMESTAMP
TIMESTAMP | QC
2019-05-04 00:22 5
2019-05-04 00:24 1
2019-05-09 03:30 3
START | END
20190504_0023 20190504_0024
dfNew的外观如下所示:
TIMESTAMP | QC
2019-05-04 00:22 5
2019-05-04 00:24 1
2019-05-09 03:30 3
START | END
20190504_0023 20190504_0024
所以我想用QC=-1替换df中第二行的QC=1
这是我目前的代码:
for index, row in dfNew.iterrows():
df['TIMESTAMP'] = pd.to_datetime(df['TIMESTAMP'])
start = datetime.datetime.strptime(row[0], "%Y%m%d_%H%M")
end = datetime.datetime.strptime(row[1], "%Y%m%d_%H%M")
masked = (df['TIMESTAMP'] >= start) & (df['TIMESTAMP'] <= end)
df['QC'].mask(masked, -1)
对于索引,dfNew.iterrows()中的行:
df['TIMESTAMP']=pd.to_datetime(df['TIMESTAMP']]
start=datetime.datetime.strtime(行[0],%Y%m%d\uh%m”)
end=datetime.datetime.strtime(第[1]行,%Y%m%d\u%H%m”)
masked=(df['TIMESTAMP']>=start)和(df['TIMESTAMP']主要是需要将列值设置为等于应用的掩码:df['QC']=df['QC'].mask(masked,-1)
循环外只需将“TIMESTAMP”列转换为datetimes即可。假设dfNew中有多行,则每行的开始时间和结束时间都会更改,因此这将保留在循环内
# this should be outside of the loop
df['TIMESTAMP'] = pd.to_datetime(df['TIMESTAMP'])
for index, row in dfNew.iterrows():
start = datetime.datetime.strptime(row[0], "%Y%m%d_%H%M")
end = datetime.datetime.strptime(row[1], "%Y%m%d_%H%M")
masked = (df['TIMESTAMP'] >= start) & (df['TIMESTAMP'] <= end)
df['QC'] = df['QC'].mask(masked, -1)
#这应该在循环之外
df['TIMESTAMP']=pd.to_datetime(df['TIMESTAMP']]
对于索引,dfNew.iterrows()中的行:
start=datetime.datetime.strtime(行[0],%Y%m%d\uh%m”)
end=datetime.datetime.strtime(第[1]行,%Y%m%d\u%H%m”)
蒙面=(df['TIMESTAMP']>=start)和(df['TIMESTAMP']我想这就是你想要的
df.TIMESTAMP = pd.to_datetime(df.TIMESTAMP)
dfNew.START = pd.to_datetime(dfNew.START, format='"%Y%m%d_%H%M"')
dfNew.END = pd.to_datetime(dfNew.END, format='"%Y%m%d_%H%M"')
def f(row):
df.loc[df['TIMESTAMP'].between(row[0], row[1]), 'QC'] = -1
dfNew.apply(f, axis=1)
布尔选择
m=df.QC==1
使用loc访问器
df.loc[m,'QC']=-1
我应该澄清,初始质量控制值可以是任意的,因此我只想在掩码中使用时间戳作为标准。我认为下面的一个答案是有效的。无论如何,谢谢!:)