【问题标题】:Apply function for specific months and days in pandas data frame在熊猫数据框中应用特定月份和日期的功能
【发布时间】:2021-09-22 04:14:43
【问题描述】:

假设我有 2010 年到 2020 年的每日数据:

Ex:

Date            col1

2010-01-01      False
2010-01-02      False
...

2020-12-31      False

我想为所有行设置 col1 = True,其中(月等于 4,日大于 25),月等于 5,日小于 5。所以基本上这意味着,对于介于4月25日和5月5日我要设置col1 = True。

我该怎么做?

【问题讨论】:

标签: python pandas


【解决方案1】:

您可以使用.dt.month.dt.day从日期开始访问monthday,然后从中创建条件:

df.loc[
  ((df.Date.dt.month == 4) & (df.Date.dt.day > 25)) | 
  ((df.Date.dt.month == 5) & (df.Date.dt.day < 5)), 
'col1'] = True

假设你的Date已经是datetime类型,如果不是,你可以使用以下转换:

df.Date = pd.to_datetime(df.Date)

【讨论】:

  • +10,我认为这确实适用于给定的范围,但可能会在 04-25 到 08-05 等其他范围内变得笨拙(因为内月没有日期限制?)
  • 我猜 04-25 到 08-05 会像 ((df.Date.dt.month == 4) &amp; (df.Date.dt.day &gt; 25)) | (df.Date.dt.month &gt; 4) | (df.Date.dt.month &lt; 8) | ((df.Date.dt.month == 8) &amp; (df.Date.dt.day &lt; 5))
  • @tdy 是的,在这种情况下,我们可以添加另一个或条件来表示df.Date.dt.month.between(5, 7)。不过可能不是最简洁的。
【解决方案2】:

您可以创建一个布尔索引并将其分配给数据框中的新列。

要查找Date 的值介于其他两个值之间的行,您可以使用between 方法。 between 可以接受一个参数 inclusive,它可以是 "both""neither""left""right" 中的任何一个。使用它来拨入您想要的确切时间间隔。

若要忽略年份并仅比较月份和日期,如果列的 dtype 为 datetime64,则可以使用 dt 访问器并使用 strftime 仅获取月份和日期作为字符串,然后使用字典顺序进行比较:

col1 = df['Date'].dt.strftime('%m-%d').between(
    '04-25', 
    '05-05', 
    inclusive="neither"
)

将布尔索引添加到您的数据框:

df['col1'] = col1

只为匹配的行设置 'col1' 中的值,每个 cmets 中的 @tdy:

df.loc[col1, 'col1'] = True

【讨论】:

  • 啊,我重新阅读了您的问题,看来您只想比较月份和日期,而不是年份。再次编辑。
  • 是的,这也是困扰我的地方。
  • 使用新解决方案编辑。
  • 啊 +10,我认为这确实有效,并且比我的 groupby 方法简单得多
  • 但是请注意,这会修改整个列。如果您想将匹配日期设置为True而不更改其他值,请使用locmaskdf[col1, 'col1'] = Truedf['col1'] = df['col1'].mask(col1, True)
猜你喜欢
  • 1970-01-01
  • 2022-07-06
  • 2015-04-18
  • 2017-06-14
  • 1970-01-01
  • 2020-11-28
  • 2020-03-28
  • 1970-01-01
  • 2023-03-20
相关资源
最近更新 更多