在Python中用熊猫重复一个年度循环

问题描述 投票:1回答:1

我正在尝试操纵熊猫的年度数据周期。我创建了一个降雨数据的年度循环(包括leap日),其中索引是代表月份和日期的字符串。

我想在一个具有日期时间索引的时间段内(例如1980-2020年)重复此数据。在熊猫中,有没有一种整齐的方法可以做到这一点?我能想到的唯一方法是创建一个空的数据框并在年份之间循环,检查leap年,但是我确信必须有更好的方法。

到目前为止,我有:

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个回答
0
投票

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

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')
热门问题
推荐问题
最新问题