Python 按日期显示特定列

Python 按日期显示特定列,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个dataframe(df),它有两个主列——一个称为'TIMESTAMP',表示日期,另一个称为'QC',反映质量控制标志,如int。这个df大约有40000行,所以我不想对每一行进行迭代 我有一个新的数据帧(dfNew),它只有两列,其中有几个开始日期对和结束日期对。我想查看我的原始df,对于时间戳位于dfNew中列出的任何开始-结束日期对之间的所有行,我想用-1替换QC值。这个dfNew大约有400行,所以我认为在这里迭代不会太糟糕 df看起来像这样: TIMESTAMP

我有一个dataframe(df),它有两个主列——一个称为'TIMESTAMP',表示日期,另一个称为'QC',反映质量控制标志,如int。这个df大约有40000行,所以我不想对每一行进行迭代

我有一个新的数据帧(dfNew),它只有两列,其中有几个开始日期对和结束日期对。我想查看我的原始df,对于时间戳位于dfNew中列出的任何开始-结束日期对之间的所有行,我想用-1替换QC值。这个dfNew大约有400行,所以我认为在这里迭代不会太糟糕

df看起来像这样:

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

我应该澄清,初始质量控制值可以是任意的,因此我只想在掩码中使用时间戳作为标准。我认为下面的一个答案是有效的。无论如何,谢谢!:)