我试图根据观察到的天气数据创建一个新的季节性数据序列。
我想从这个数据框中提取季节,并创建一个新的数据框,该数据框具有按时间顺序彼此跟随的随机季节序列,例如:一个随机的春天,随后是一个随机的夏天,然后是一个随机的秋天,然后是一个随机的冬天。
我正在使用的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月)。
为了让我生成这个新的序列,我将需要根据每年的每个季节,所以我可以创建一个包含多个列的新数据框,所有列都以随机弹簧开始,然后是随机夏天,然后是随机秋天,然后是一个随机的冬天,未来数百年。
我无法弄清楚这是怎么做到的。请帮忙!
由于
答案 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月份添加到次年的冬季。