【问题标题】:Repeating an annual cycle with Pandas in Python在 Python 中使用 Pandas 重复一个年度循环
【发布时间】:2020-02-21 11:29:47
【问题描述】:

我正在尝试操纵 pa​​ndas 中数据的年度周期。我创建了降雨数据的年度周期(包括闰日),其中索引是代表月份和日期的字符串。

我想使用日期时间索引在一段时间内(比如 1980-2020 年)重复这些数据。在熊猫中有没有一种巧妙的方法来做到这一点?我能想到的唯一方法是创建一个空的数据框并循环遍历这些年,检查闰年,但我相信一定有更好的方法。

到目前为止,我得到了:

import pandas as pd
import numpy as np
import calendar

data = np.random.rand(366)
df_annual_cycle = pd.DataFrame(
    columns=['annual_cycle'],
    index=pd.date_range('2004-01-01','2004-12-31').strftime('%m-%d'),
    data=data
)

df_annual_cycle.head()

#        annual_cycle
# 01-01      0.863838
# 01-02      0.234168
# 01-03      0.368678
# 01-04      0.066332
# 01-05      0.493080


df_every_year=pd.DataFrame(
    columns=['rainfall'],index=pd.date_range('1980-01-01','2020-12-31')
)

for year in df_every_year.index.year:
    if calendar.isleap(year):
        df_every_year[
            df_every_year.index.year==year
        ] = df_annual_cycle.values
    elif ~calendar.isleap(year):
        df_every_year[
            df_every_year.index.year==year
        ] = df_annual_cycle.drop(index='02-29').values

理想情况下,我希望不必使用 .values 转换为 numpy 数组,因为我的数据框有多个(可能是可变的)列。

【问题讨论】:

    标签: python pandas datetime cycle


    【解决方案1】:

    对于其他尝试这样做的人来说,这要快得多(尽管仍然不是很整洁):

    import pandas as pd
    import numpy as np
    import calendar
    
    data = np.random.rand(366)
    df_annual_cycle = pd.DataFrame(
        columns=['annual_cycle'],
        index=pd.date_range('2004-01-01','2004-12-31').strftime('%m-%d'),
        data=data
    )
    
    
    years=np.arange(1980,2020)
    df_every_year=pd.concat([df_annual_cycle]*40)
    myindex=(np.repeat(years,366).astype(str)+df_every_year.index)
    df_every_year.index=myindex
    for year in np.arange(1980,2020):
        if ~calendar.isleap(year):
            df_every_year.drop(index=str(year)+'02-29',inplace=True)
    df_every_year.index=pd.to_datetime(df_every_year.index,format='%Y%m-%d')
    

    【讨论】:

      猜你喜欢
      • 2013-09-10
      • 1970-01-01
      • 2020-08-03
      • 2021-07-16
      • 2016-12-31
      • 2020-03-17
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多