Pandas Dataframe 保留日期在两个日期之间的行(单独的列)
Posted
技术标签:
【中文标题】Pandas Dataframe 保留日期在两个日期之间的行(单独的列)【英文标题】:Pandas Dataframe keep rows where date is between two dates (seperate columns) 【发布时间】:2021-04-07 19:36:15 【问题描述】:我有一个与此类似的数据框:
Price From To
300€ 2020-01-01 2020-01-07
250€ 2020-01-04 2020-01-08
150€ 2020-02-01 2020-02-04
350€ 2020-02-04 2020-02-08
然后我有一个日期列表。例如:list = [2020-01-03, 2020-02-04]
我只想保留日期在From
列和To
列之间的数据框行。
因此,转换后我将拥有以下数据框。
Price From To
300€ 2020-01-01 2020-01-07
150€ 2020-02-01 2020-02-04
350€ 2020-02-04 2020-02-08
首先我想到了使用带有 apply 的 lambda,但我认为它不是很有效,因为我的数据集非常大。有没有更简单的方法可以用 pandas 做到这一点?
结果将包含在一个数据帧中
【问题讨论】:
您能否更准确地指定日期的list
?是否保证熊猫数据框的每一行都有一个条目?或者它是一个双元素列表,您想将第一个元素与数据框中的From
和第二个元素与To
列进行比较?
该列表包含以下格式的日期列表:年-月-日(可以是字符串类型或日期类型,如果需要,我可以转换它们)。列表中的日期与数据框中的日期具有相同的格式。数据框中没有 NAN 值,列表将包含至少一个日期。
列表可能包含更多日期。在示例中,我只放了 2 天,但可能是 3 天甚至 4 天
好的,那么列表中的哪个日期应该与数据框中的哪个日期进行比较?或者结果是几个数据框,列表中的每个项目一个?
如果我查看上面给出的示例,我想获取列表中的第一个日期,并保留该日期在 From 和 To 之间的所有行。然后我会取列表的第二个日期,然后保留该日期在 From 和 To 日期之间的所有行。够清楚吗?
【参考方案1】:
让我们试试numpy broadcasting
:
x, y = df[['From', 'To']].values.T
a = np.array(['2020-01-03', '2020-02-04'], dtype=np.datetime64)
mask = ((x[:, None] <= a) & (y[:, None] >= a)).any(1)
df[mask]
Price From To
0 300€ 2020-01-01 2020-01-07
2 150€ 2020-02-01 2020-02-04
3 350€ 2020-02-04 2020-02-08
【讨论】:
不错的解决方案,Shubham!你得到了我的支持! 感谢@DanailPetrov 节日快乐! 非常感谢,但当我应该得到一些 True 时,我只会在面具中得到 False。我不确定我是否理解最后一行(掩码 = ...),请您稍微解释一下吗? @colla 检查df.dtypes
From
和To
列的数据类型应该是datetime64
,如果不是你首先需要使用pd.to_datetime
将它们转换为日期时间类型。 .
我的 To 和 From 列都转换为 datetime64 : df['From'] = df['From'].astype('datetime64[ns]')【参考方案2】:
一种选择是使用 Pandas IntervalIndex:
dates = ['2020-01-03', '2020-02-04']
dates = pd.to_datetime(dates)
intervals = pd.IntervalIndex.from_arrays(df.From, df.To, closed='both')
df.iloc[intervals.get_indexer_for(dates)] # for duplicates, you can use .unique
Price From To
0 300€ 2020-01-01 2020-01-07
2 150€ 2020-02-01 2020-02-04
3 350€ 2020-02-04 2020-02-08
【讨论】:
以上是关于Pandas Dataframe 保留日期在两个日期之间的行(单独的列)的主要内容,如果未能解决你的问题,请参考以下文章
Pandas:从 Pandas DataFrame 中选择两个日期之间的所有数据
合并两个日期字段在两个月内的 pandas DataFrame
Pandas Dataframe 合并 2 列,包括条件 If 合并:如果 df_2 中的日期在 df_1 中的其他两个日期之间