【问题标题】:Why does pandas dayofyear return 366 rows after I've removed the leap days?为什么删除闰日后 pandas dayofyear 会返回 366 行?
【发布时间】:2019-03-28 08:55:41
【问题描述】:

我有一个数据框,其中包含 11 年的最高和最低温度数据(2005 年到 2015 年)。我试图找出 10 年期间每一天的最高和最低温度。

我从数据中删除了 2 个闰日,即 2008-02-29 和 2012-02-29,但是当我将 dayofyear 应用于数据时,它返回 366 行,我不知道为什么。

我已经分解了步骤并测试了每个部分。当我应用 dayofyear 时,闰日日期绝对不在数据框中

在我删除闰日并使用以下方法检查后: dfmax['2008-02-26':'2008-03-02']

2 月 29 日不在那里。

下一步是按年份聚合日期以获得最高温度:

maxtemp = dfmax.groupby(dfmax.index.dayofyear).aggregate(max)

maxtemp.info()

我明白了:

Int64Index:366 个条目,1 到 366

我预计有 365 个条目。我做错了什么?

【问题讨论】:

  • 我不记得 Pandas 的具体年份,但从逻辑上考虑...非闰年应该有 0...364 天。闰年有 0...365。如果您删除 2 月 29 日(一年中的第 59 天)而不将后面的日期向前滑动,则闰年将有 0...365 而没有 59。3 月 1 日是闰年的第 60 天,但非闰年的第 59 天。因此,您的数据应该包含一年中的所有日期,0...365(即 366 个条目)。
  • 感谢 Amadan,但我在应用 groupby 之前删除了闰日,所以我不明白为什么会有任何数据滑动。 dfmax 数据框中的总行数是 4015,即 11*365,所以我希望它能给我 365 行和 dayofyear。
  • 您有 11*365 行,但其中有 366 个不同的值。 1 月 1 日 => 0、2 月 28 日 => 58、2 月 29 日闰 => 59、3 月 1 日非闰 => 59、3 月 1 日 => 60、12 月 31 日非闰 => 364、12 月 31 日闰年 => 365。如果你想有 365 个不同的值,你需要从闰年 2 月 29 日之后的所有日期中减去 1,你说你没有这样做。
  • 刚刚去掉了聚合函数,发现了一些有趣的东西,即maxtemp = dfmax.groupby(dfmax.index.dayofyear)查看每一行的大小,我得到365 of 11,第366条记录是2。第366行的值不对应在任何闰日都有最高温度。似乎该函数将丢失的闰日补回来了?
  • 你确定你得到了 11 个中的 365 个吗?我认为您在第 60 个 ([59]) 时只会看到 9 个,而不是 11 个。

标签: python pandas


【解决方案1】:

Pandas 地图上的 dayofyear 属性与索引中实际出现的日期无关。它是根据日历中当天的位置分配的整数。

换句话说,2008 年 12 月 31 日是总是 366,无论指数的其余部分如何。因此,如果您正在查看 2008 年(闰年)并删除了 2 月的最后一天,那么您只是从集合中删除了 60 号,而不是重置计数。

根据文档:

此属性返回特定日期在一年中的哪一天 日期发生。常规返回值范围在 1 到 365 之间 年,闰年为 1 到 366。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    • 2016-04-05
    相关资源
    最近更新 更多