使用pandas以特定顺序选择时间序列数据

时间:2015-10-30 12:26:42

标签: python csv pandas

我试图根据观察到的天气数据创建一个新的季节性数据序列。

我想从这个数据框中提取季节,并创建一个新的数据框,该数据框具有按时间顺序彼此跟随的随机季节序列,例如:一个随机的春天,随后是一个随机的夏天,然后是一个随机的秋天,然后是一个随机的冬天。

我正在使用的CSV格式的时间序列数据here

到目前为止,我使用的代码如下......

df = pd.read_csv("location of file")

#convert date column to datetime for querying
df['date'] = pd.to_datetime(df['date'], format= '%d-%b-%y')

#function which extracts seasons
def get_season(row):
if row['date'].month >= 3 and row['date'].month <= 5:
    return 'spring'
elif row['date'].month >= 6 and row['date'].month <= 8:
    return 'summer'
elif row['date'].month >= 9 and row['date'].month <= 11:
    return 'autumn'
else:
    return 'winter'

#apply the season function to the data frame
df['Season'] = df.apply(get_season, axis=1)

#Split into seasons
Sp = df.query('Season == "spring"')
#all the winters
W = df.query('Season == "winter"')
#all the summers
SU  = df.query('Season == "summer"')
#all the autumns
Au = df.query('Season == "autumn"')

在这里,我无法理解下一步该做什么。

这样做是将所有季节分开,但不是每个季节(例如2006年冬季,2007年冬季等)。

我目前正在每个季节随机抽取序列:

#sampling a random 92 days from winter
rows = np.random.choice(Sp.index.values, 92)
sampled_df = Sp.ix[rows] 

但这并不是我想要的,因为它从整个冬季区域随机抽天,我想从冬季区块随机选择季节(12月,1月,2月)。

为了让我生成这个新的序列,我将需要根据每年的每个季节,所以我可以创建一个包含多个列的新数据框,所有列都以随机弹簧开始,然后是随机夏天,然后是随机秋天,然后是一个随机的冬天,未来数百年。

我无法弄清楚这是怎么做到的。请帮忙!

由于

1 个答案:

答案 0 :(得分:2)

我建议MultiIndex

df['Year'] = df['date'].dt.year
df2 = df.set_index(['Year', 'Season'], inplace=False)

您现在拥有按年份和季节编制索引的数据框,您可以轻松选择特定年份的整个季节:

future = pd.DataFrame()
for i in range(5):
    for season in ['winter', 'spring', 'summer', 'autumn']:
        future = future.append(df2.loc[random.choice(range(2007, 2015))]
                                  .loc[season])

请注意,我已排除2015年,因为您的数据中没有秋季或冬季 - 您可以自行解决此问题。

此外,特定年份的冬季目前包括1月,2月和12月。您可能希望重新定义年份,以便将12月份添加到次年的冬季。