簡體   English   中英

將年份和日期轉換為 pandas 中的日期時間索引

[英]Converting year and day of year into datetime index in pandas

我有一個 dataframe:

 year  doy
 2000   49   
 2000   65   
 2000   81   
 2001   97   
 2001  113   
 2001  129   
 2001  145   
 2001  161 

我想為此 dataframe 創建一個日期時間索引。這是我正在做的事情:

df.index = pandas.DatetimeIndex(df['doy'].apply(lambda x: date(2000, 1, 1)+ relativedelta(days=int(x)-1)))

但是,這會創建一個僅使用 2000 作為年份的日期時間索引。 我該如何解決?

您可以使用日期說明符%j來提取一年中的哪一天。 所以將兩列組合起來,移動年份,然后轉換為日期時間!

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]

您可以使用NumPy datetime64/timedelta64 算法來查找所需的日期:

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

產量

            doy  year
2000-02-18   49  2000
2000-03-05   65  2000
2000-03-21   81  2000
2001-04-07   97  2001
2001-04-23  113  2001
2001-05-09  129  2001
2001-05-25  145  2001
2001-06-10  161  2001

pd.to_datetime()中,您可以將格式和起始日期指定為:

pd.to_datetime(df['doy'], unit='D', origin=pd.Timestamp(df['year']))

此方法為您完成所有艱苦的工作。

使用read_csv()

import pathlib
import pandas as pd

def yday2date(year, yday):
    return pd.to_datetime(year + '-' + yday,
                          format='%Y-%j')

df = pd.read_csv('input.txt', sep='\s+', 
                 parse_dates={'date': ['year', 'doy']},
                 date_parser=yday2date,
                 index_col='date')

問:如何將一年中的某一天轉換為日期時間?

A:給定 arrays 年份和工作時間:

y = pd.to_datetime(year, format = '%Y')
td = pd.Series(doy).apply(lambda x: pd.Timedelta(x, unit = 'd'))
t =  y + td

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM