[英]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')
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.