如何根据零数据的月份计算天数?

时间:2016-09-30 17:00:51

标签: python pandas

我正在编写一个脚本,其中我在csv中读取了多个列和行。我需要脚本将每列中的值合计为一行,并返回哪些列的行值为零。以下是数据外观的示例,还有其他几个列,但这些是我的问题所关注的列:

    JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
     0   0   5   5   0   5   5   5   5   0   0   0

这是我到目前为止所做的:

    import pandas as pd
    import os

    os.chdir('C:\\users\\vroland\\desktop\\RR_WMD\\WUdata')

    fout=open("WUinput.csv","a")
    #read water use file
    df=pd.read_csv("WUtest.csv")
    #Header & months with zero values
    cols=df.columns
    #Boolean array of columns with zero values
    bt=df.apply(lambda x: x==0)
    #List months with zero values
    zar=bt.apply(lambda x:list(cols[x.values]),axis=1)

我尝试了各种方法,包括if语句,但我不断收到错误,说明我的条件语句含糊不清,所以我正在尝试另一种方法。所以这就是我现在要处理的代码块:

   a=30
   b=31
   c=28
   num_days=pd.DataFrame({'JAN':[b],'FEB':[c],'MAR':[b],'APR':[a],'MAY':[b],
                          'JUN':[a],'JUL':[b],'AUG':[b],'SEP':[a],'OCT':[b],
                          'NOV':[a],'DEC':[b]})

我们的想法是使用zar中返回的值来查找数据框num_days中的相应日期值。返回此值并计算值为零的总天数。

2 个答案:

答案 0 :(得分:0)

好吧,我会摆脱" fout"线。您似乎没有写入该文件,也不需要打开即可使用" read_csv"大熊猫的特点。然后你可以浏览每一行,找到零,什么不是

returnArray = []
i=0
while i < len(df.values):
    j=14 #since user only cares about column 14-26
    while j < len(df.values[i]):
        if df.values[i][j] == 0:
            returnArray.append([i,j])
        j=j+1
    i=i+1

答案 1 :(得分:0)

考虑pd.DataFrame df

cols = ['JAN', 'FEB', 'MAR', 'APR',
        'MAY', 'JUN', 'JUL', 'AUG',
        'SEP', 'OCT', 'NOV', 'DEC']

df = pd.DataFrame(np.random.randint(0, 3, (10, 12)), columns=cols)
df

enter image description here

我将row == 0的每一行评估用作列本身的布尔掩码。使用list很好地适应pd.Series

df.eq(0).apply(lambda x: list(df.columns[x]), 1)

0                   [FEB, MAR, APR, NOV]
1                        [FEB, OCT, NOV]
2              [JAN, APR, AUG, NOV, DEC]
3                        [MAR, APR, SEP]
4                   [MAY, JUN, NOV, DEC]
5                        [APR, AUG, NOV]
6         [MAR, APR, JUN, OCT, NOV, DEC]
7    [JAN, FEB, APR, JUL, OCT, NOV, DEC]
8              [MAY, JUL, AUG, SEP, OCT]
9         [FEB, MAR, APR, JUN, AUG, SEP]
dtype: object

获取天数

days_in_month = pd.Series(dict(
        JAN=31, FEB=28, MAR=31,
        APR=30, MAY=31, JUN=30,
        JUL=31, AUG=31, SEP=30,
        OCT=31, NOV=30, DEC=31
    ))

df.eq(0).dot(days_in_month)

0    119
1     89
2    153
3     91
4    122
5     91
6    183
7    212
8    154
9    180
dtype: int64