【问题标题】:Leap years in pandas.DatetimeIndex.dayofyearpandas.DatetimeIndex.dayofyear 中的闰年
【发布时间】:2017-10-17 22:32:29
【问题描述】:

我想根据具有多年数据的时间序列计算一年中某天的平均值。因此,我在处理闰年时遇到了一个问题,如下例所示。

ind=pd.DatetimeIndex(start='2016-01-01', end='2016-12-31', freq='d')
dat=np.arange(1,367,1)
ser=pd.Series(dat, index=ind)

由于闰年,结果系列有 366 个条目。

我通过以下方式手动删除了 2 月 29 日的条目:

ser=ser[~((ser.index.month==2)&(ser.index.day==29))]

正如预期的那样,该系列之后只有 365 个条目。

当我计算一年中一天的平均值时:

doy_mean=ser.groupby(ser.index.dayofyear).mean()

我又得到了一个包含 366 个条目的系列。任何想法如何处理这个?

谢谢!

【问题讨论】:

  • 您所做的只是删除 2 月 29 日,一年中的最后一天的 dayofyear 值仍为 366。因此,您可以删除一年中的最后一天或按月和日的组值,如果您只想删除 2 月 29 日
  • 检查len(doy_mean)应该是365。
  • 谢谢!我想从 30 年的时间序列中计算温度平均值。如果我 goupby dayofyear 第 365 天的值是根据非闰年的 12 月 31 日和闰年的 12 月 30 日的值计算的。按月和日分组时,我可以避免这个错误。

标签: python pandas


【解决方案1】:

我在这里没有遵循你的完整逻辑,但你可以以此为起点。

ind=pd.DatetimeIndex(start='2016-01-01', end='2016-12-31', freq='d')
dat=np.arange(1,367,1)
ser=pd.Series(dat, index=ind)

ser=ser[~((ser.index.month==2)&(ser.index.day==29))]
ser = ser.ne(0).cumsum()

ser.groupby(ser.values).mean()

输出:

1    1
2    2
3    3
4    4
5    5
...
361    361
362    362
363    363
364    364
365    365
dtype: int32

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多