选择数据框的日期并遍历日期索引

时间:2018-09-21 20:33:16

标签: python loops datetime dataframe

我有一个日期为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中使用过循环)。 谢谢, 约阿纳州

1 个答案:

答案 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))