我有这个人。数据帧:
County Year JD Tot_P Min_P
0 Ady 2000 1 127 10.03
1 Ady 2000 2 127 10.03
2 Ady 2000 3 127 10.03
3 Ady 2000 4 127 10.03
4 Ady 2000 5 127 10.03
这里JD是朱利安日(一年中每天1 ... 365;闰年1 - 366)。我想再添加2列,1个月,1个月。这就是我现在正在做的事情:
from datetime import date
df['MONTH'] = df[['Year','JD']].apply(lambda s: date.fromordinal(date(df.Year, 1, 1).toordinal() + df.JD - 1).month)
df['DAY'] = df[['Year','JD']].apply(lambda s: date.fromordinal(date(df.Year, 1, 1).toordinal() + df.JD - 1).day)
然而,我收到错误:
TypeError: ("cannot convert the series to <type 'int'>", u'occurred at index Year')
我该如何解决这个问题?
答案 0 :(得分:1)
这是一种矢量化方法,应该非常高效。
读入数据
In [14]: df = read_csv(StringIO(data),sep='\s+')
In [15]: df
Out[15]:
County Year JD Tot_P Min_P
0 Ady 2000 1 127 10.03
1 Ady 2000 2 127 10.03
2 Ady 2000 3 127 10.03
3 Ady 2000 4 127 10.03
4 Ady 2000 5 127 10.03
直接创建日期时间列; julian日期只是添加到开始日期的天数(因为从第1天开始,你减去1)。
In [21]: df['date'] = pd.to_datetime(df['Year'],format='%Y') + pd.to_timedelta(df['JD'],unit='D') - Timedelta('1D')
In [22]: df
Out[22]:
County Year JD Tot_P Min_P date
0 Ady 2000 1 127 10.03 2000-01-01
1 Ady 2000 2 127 10.03 2000-01-02
2 Ady 2000 3 127 10.03 2000-01-03
3 Ady 2000 4 127 10.03 2000-01-04
4 Ady 2000 5 127 10.03 2000-01-05
您可以使用.dt
访问者执行许多操作,请参阅文档here
In [23]: df.date.dt.day
Out[23]:
0 1
1 2
2 3
3 4
4 5
dtype: int64
In [24]: df.date.dt.month
Out[24]:
0 1
1 1
2 1
3 1
4 1
dtype: int64
In [25]: df.date.dt.year
Out[25]:
0 2000
1 2000
2 2000
3 2000
4 2000
dtype: int64
答案 1 :(得分:0)
还有一些步骤,有一些辅助列,但似乎有效:
df['y_ord'] = df.Year.apply(lambda x: datetime.datetime.toordinal(pd.to_datetime(x.astype(int), format="%Y")))
df['d_ord'] = df['y_ord'].astype(int) + df.JD.astype(int) - 1
df['DAY'] = df.d_ord.apply(lambda x: datetime.datetime.fromordinal(x).day)
df['MONTH'] = df.d_ord.apply(lambda x: datetime.datetime.fromordinal(x).month)