Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将熊猫的年和日转换为日期时间索引_Python_Pandas - Fatal编程技术网

Python 将熊猫的年和日转换为日期时间索引

Python 将熊猫的年和日转换为日期时间索引,python,pandas,Python,Pandas,我有一个数据帧: year doy 2000 49 2000 65 2000 81 2001 97 2001 113 2001 129 2001 145 2001 161 我想为这个数据帧创建一个日期时间索引。以下是我正在做的: df.index = pandas.DatetimeIndex(df['doy'].apply(lambda x: date(2000, 1, 1)+ relativedelta(

我有一个数据帧:

 year  doy
 2000   49   
 2000   65   
 2000   81   
 2001   97   
 2001  113   
 2001  129   
 2001  145   
 2001  161 
我想为这个数据帧创建一个日期时间索引。以下是我正在做的:

df.index = pandas.DatetimeIndex(df['doy'].apply(lambda x: date(2000, 1, 1)+ relativedelta(days=int(x)-1)))
但是,这将创建一个日期时间索引,该索引仅使用2000作为年份。如何解决此问题?

您可以使用查找所需日期:

In [97]: (np.asarray(df['year'], dtype='datetime64[Y]')-1970)+(np.asarray(df['doy'], dtype='timedelta64[D]')-1)
Out[97]: 
array(['2000-02-18', '2000-03-05', '2000-03-21', '2001-04-07',
       '2001-04-23', '2001-05-09', '2001-05-25', '2001-06-10'], dtype='datetime64[D]')
由于根据日期的不同部分(例如年、月、日、周、小时等)组合日期是一个常见的问题,因此这里提供了一个实用函数,使其更容易:

def compose_date(years, months=1, days=1, weeks=None, hours=None, minutes=None,
                 seconds=None, milliseconds=None, microseconds=None, nanoseconds=None):
    years = np.asarray(years) - 1970
    months = np.asarray(months) - 1
    days = np.asarray(days) - 1
    types = ('<M8[Y]', '<m8[M]', '<m8[D]', '<m8[W]', '<m8[h]',
             '<m8[m]', '<m8[s]', '<m8[ms]', '<m8[us]', '<m8[ns]')
    vals = (years, months, days, weeks, hours, minutes, seconds,
            milliseconds, microseconds, nanoseconds)
    return sum(np.asarray(v, dtype=t) for t, v in zip(types, vals)
               if v is not None)

df = pd.DataFrame({'doy': [49, 65, 81, 97, 113, 129, 145, 161],
                   'year': [2000, 2000, 2000, 2001, 2001, 2001, 2001, 2001]})

df.index = compose_date(df['year'], days=df['doy'])

您可以使用日期说明符
%j
提取一年中的日期。因此,合并这两列,转换年份,并转换为datetime

pd.to_datetime(df['year'] * 1000 + df['doy'], format='%Y%j')
返回

0   2000-02-18
1   2000-03-05
2   2000-03-21
3   2001-04-07
4   2001-04-23
5   2001-05-09
6   2001-05-25
7   2001-06-10
dtype: datetime64[ns]

谢谢@unutbu!1970年有什么特别的地方吗?我可以使用1900或2000吗?
1970-01-01 00:00:00 UTC
。由于
np.array([0],dtype='datetime64[Y]')
返回
array(['1970',dtype='datetime64[Y]')
,我们必须减去1970。在这个解决方案中如何包含小时?@AdamErickson。。。这个网站对于python日期时间格式说明符非常有用。你发现了吗,@AdamErickson?
0   2000-02-18
1   2000-03-05
2   2000-03-21
3   2001-04-07
4   2001-04-23
5   2001-05-09
6   2001-05-25
7   2001-06-10
dtype: datetime64[ns]