我有一个数据框。形成:
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/