【问题标题】:Pandas DataFrame: Delete specific date in all leap yearsPandas DataFrame:删除所有闰年的特定日期
【发布时间】:2015-09-08 21:52:24
【问题描述】:

以下序列是我得到的 pandas DataFrame 的摘录:

>>> df_t
              value
2011-01-31    -5.575000
2011-03-31     7.700000
2011-05-31    15.966667
2011-07-31    10.683333
2011-08-31    10.454167
2011-10-31     9.320833
2011-12-31    -0.358333
2012-01-31   -11.550000
2012-03-31     1.700000
2012-05-31    12.333333
2012-07-31    12.816667
2012-08-31    11.837500
2012-10-31     2.733333
2012-12-31     4.075000
2013-01-31     2.450000
2013-03-31    -4.262500
2013-05-31    11.491667
2013-07-31    14.812500
2013-08-31    13.920833
2013-10-31     4.125000
2013-12-31     0.075000 

如何在每个闰年删除 3 月 31 日? 我试过类似的东西:

def isleap(year):
return year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)

if isleap(df_t.index.year):
        df_t=df_t[df_t.index.dayofyear!=91]

...但显然,这在我的脑海中太简单了。如果年份是闰年并且日期是一年中的第 91 天,是否有唯一的解决方案可以遍历整个数据框并在每一步检查,还是有更简单的解决方案可用?

编辑:问题不在于如何确定一年是否为闰年,而是如果是,则删除上述数据框中的 3 月 31 日。

【问题讨论】:

  • 对不起,如果你的日期已经是日期时间,你不能只做df_t[(df_t.index.month == 3) & (df_t.index.day == 31)]
  • 感谢您的评论!当然可以,但是以否定形式使用此代码会删除 每年 年的 3 月 31 日...
  • 不,我们的想法是只过滤这些日期,然后确定它是否是闰年,然后删除它们
  • 啊,谢谢!我想这就是李建勋一步到位的想法。

标签: python select pandas leap-year


【解决方案1】:

这是一个以矢量化方式执行此操作的示例。请注意,andor 不适用于布尔向量,请改用 &|

import pandas as pd
import numpy as np

s = pd.Series(np.random.randn(600), index=pd.date_range('1990-01-01', periods=600, freq='M'))

Out[76]: 
1990-01-31   -0.7594
1990-02-28   -0.1311
1990-03-31    1.2031
1990-04-30    1.1999
1990-05-31   -2.4399
               ...  
2039-08-31   -0.3554
2039-09-30   -0.3265
2039-10-31   -0.3832
2039-11-30   -1.4139
2039-12-31   -0.3086
Freq: M, dtype: float64


def is_leap_and_MarchEnd(s):
    return (s.index.year % 4 == 0) & ((s.index.year % 100 != 0) | (s.index.year % 400 == 0)) & (s.index.month == 3) & (s.index.day == 31)

mask = is_leap_and_MarchEnd(s)
s[mask]
Out[77]: 
1992-03-31    0.7834
1996-03-31    0.3121
2000-03-31   -1.2050
2004-03-31    0.6017
2008-03-31    0.1045
               ...  
2020-03-31    1.1037
2024-03-31    0.5139
2028-03-31   -0.8116
2032-03-31   -0.6939
2036-03-31   -1.1999
dtype: float64

# do delete these row
s[~mask]

【讨论】:

  • 不客气。如果您除了接受我的回答之外还可以投票赞成我的回答,那就太好了。非常感谢。 :)
  • 当然,有时我对投票/接受系统还不是很熟悉;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
  • 1970-01-01
  • 2018-08-20
相关资源
最近更新 更多