我有一个日期为2006年至2016年的数据框,每个日期有7个对应的值。 数据如下:
H PS T RH TD WDIR WSP
date
2006-01-01 11:28:00 38 988.6 0.9 98.0 0.6 120.0 14.4
2006-01-01 11:28:00 46 987.6 0.5 91.0 -0.7 122.0 15.0
2006-01-01 11:28:00 57 986.3 0.5 89.0 -1.1 124.0 15.5
2006-01-01 11:28:00 66 985.1 0.5 90.0 -1.1 126.0 16.0
2006-01-01 11:28:00 74 984.1 0.4 90.0 -1.1 127.0 16.5
2006-01-01 11:28:00 81 983.3 0.4 90.0 -1.1 129.0 17.0
我想每年选择几列(例如,对于2006年来说,都是T和RH)。因此,从2006年到2016年,每年选择一堆列,然后将每个新数据帧写入一个文件中。 我做了以下事情:
df_H_T=(df[['RH','T']])
mask = (df_H_T['date'] >'2016-01-01 00:00:00') & (df_H_T['date'] <='2016-12-31 23:59:59')
df_H_T_2006 =df.loc[mask]
print(df_H_T_2006.head(20))
print(df_H_T_2006.tail(20))
但是不起作用,因为它似乎不知道什么是“日期”,但是当我打印数据框的开头时,似乎日期就在那里。我究竟做错了什么 ?
我的第二个问题是如何将其循环放置在year变量上,以便不手工编写每个新数据框并一次选择直到2016年的一年? (我是新手,从未在python中使用过循环)。 谢谢, 约阿纳州
答案 0 :(得分:0)
date
在原始数据框中,但是随后您使用df_H_T=df[['RH','T']]
,因此现在date
不在df_H_T
中。您可以使用从一个数据帧生成的掩码来切片另一个,只要它们具有相同的索引。因此,您可以
mask = (df['date'] >'2016-01-01 00:00:00') & (df['date'] <='2016-12-31 23:59:59')
df_H_T_2006 =df_H_T.loc[mask]
(注意:您要将遮罩应用于df
,但想将其应用于df_H_T
)。
如果date
为日期时间格式,则只需输入df['date'].apply(lamda x: x.year==2016)
。对于您的for循环,应该是
df_H_T=(df[['RH','T']])
for year in years:
mask = df['date'].apply(lamda x: x.year==year)
df_H_T_cur_year =df_H_T.loc[mask]
print(df_H_T_cur_year.head(20))
print(df_H_T_cur_year.tail(20))