基于 behzad.nouri 的推荐和 cs95 的较早答案的便利功能。任何错误或误解都是我的。
import pandas as pd
import numpy as np
df = pd.DataFrame([["2022-01-01", np.nan, np.nan, 1], ["2022-01-02", 2, np.nan, 2], ["2022-01-03", 3, 3, 3], ["2022-01-04", 4, 4, 4], ["2022-01-05", np.nan, 5, 5]], columns=['date', 'A', 'B', 'C'])
df['date'] = pd.to_datetime(df['date'])
df
# date A B C
#0 2022-01-01 NaN NaN 1.0
#1 2022-01-02 2.0 NaN 2.0
#2 2022-01-03 3.0 3.0 3.0
#3 2022-01-04 4.0 4.0 4.0
#4 2022-01-05 NaN 5.0 5.0
我们希望从 A 和 B 共同的最早日期开始,并在 A 和 B 共同的最晚日期结束(无论出于何种原因,我们不按 C 列过滤)。
# filter data to minimum/maximum common available dates
def get_date_range(df, cols):
"""return a tuple of the earliest and latest valid data for all columns in the list"""
a,b = df[cols].apply(pd.Series.first_valid_index).max(), df[cols].apply(pd.Series.last_valid_index).min()
return (df.loc[a, 'date'], df.loc[b, 'date'])
a,b = get_date_range(df, cols=['A', 'B'])
a
#Timestamp('2022-01-03 00:00:00')
b
#Timestamp('2022-01-04 00:00:00')
现在过滤数据:
df.loc[(df.date >= a) & (df.date <= b)]
# date A B C
#2 2022-01-03 3.0 3.0 3
#3 2022-01-04 4.0 4.0 4