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.dtypesFromTo 列的数据类型应该是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 中两个日期之间的差异

Pandas Dataframe 合并 2 列,包括条件 If 合并:如果 df_2 中的日期在 df_1 中的其他两个日期之间

Pandas Dataframe:在两种完全不同的格式之间转换日期格式[重复]

将 Pandas DataFrame 中的日期对象列转换为字符串