将朱利安日期解析为月份和月份的日期

时间:2015-09-03 19:39:05

标签: python pandas

我有这个人。数据帧:

   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')

我该如何解决这个问题?

2 个答案:

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