我有一个数据框。形成:

datetime       JD      YEAR
2000-01-01      1      2000
2000-01-02      2      2000
2000-01-03      3      2000
2000-01-04      4      2000
2000-01-05      5      2000
2000-01-06      6      2000
2000-01-07      7      2000
2000-01-08      8      2000
2000-01-09      9      2000
...
2010-12-31      365    2014


JD值是儒略日,即从每年1月1日的1开始(leap年为366,其他年为365)。从每个leap年的2月29日开始,我想将JD值减少1。非non年不应更改JD值。这是我现在正在做的事情:

def reduce_JD(row):
    if calendar.isleap(row.YEAR) & row.JD > 59:
        row.JD = row.JD - 1

    return row

def remove_leap_JD(df):
    # Reduce JD by 1 for each day following Feb 29th
    df.apply(reduce_JD, axis=1)

    return df

pdf = remove_leap_JD(pdf)


但是,我认为leap年的JD值没有任何变化。我做错了什么?

- 编辑:
datetime是索引列

最佳答案

有两个问题:


reduce_JD()中,应使用and代替&。否则,由于运算符的优先级,条件df.iloc[59].JD > 59的第二部分应放在括号中。注意:

calendar.isleap(df.iloc[59].YEAR) & (df.iloc[59].JD > 59)
# True
calendar.isleap(df.iloc[59].YEAR) & df.iloc[59].JD > 59
# False!

apply函数返回一个新的DataFrame而不是就地修改输入。因此,在remove_leap_JD()中,代码应更改为:

df = df.apply(reduce_JD, axis=1)

关于python - 减少 Pandas 数据框中leap年的列值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32941009/

10-10 21:29