Python 如何将datetime系列中的每个日期与同一系列中最近的1年前的日期进行分组?
I在数据帧内处理时间序列数据。datetime索引不完整(即缺少某些日期) 我想创建一个datetime系列偏移量为1年的新列,但只包含原始datetimeindex中存在的日期。挑战在于,在许多情况下,索引中不存在精确的1y匹配Python 如何将datetime系列中的每个日期与同一系列中最近的1年前的日期进行分组?,python,pandas,datetime,Python,Pandas,Datetime,I在数据帧内处理时间序列数据。datetime索引不完整(即缺少某些日期) 我想创建一个datetime系列偏移量为1年的新列,但只包含原始datetimeindex中存在的日期。挑战在于,在许多情况下,索引中不存在精确的1y匹配 Index (Input) 1 year offset (Output) 1/2/2014 None 1/3/2014 None 1/6/2014 None 1/7/2014 None 1/9/2014
Index (Input) 1 year offset (Output)
1/2/2014 None
1/3/2014 None
1/6/2014 None
1/7/2014 None
1/9/2014 None
1/10/2014 None
1/2/2015 1/2/2014
1/5/2015 1/3/2014
1/6/2015 1/6/2014
1/7/2015 1/7/2014
1/8/2015 1/9/2014
1/9/2015 1/10/2014
要求如下所示:
data[“1年偏移量(输出)”]=data.Index.shift(365)
没有帮助,因为索引中的日期数在不同年份中是不同的set(list)
方法从“临时1年偏移量”中删除datetimeindex中不存在的单个日期,并用NaN替换单元格argmin
import pandas as pd
import datetime
df = pd.DataFrame(dict(dates=[
'1/3/2014',
'1/6/2014',
'1/7/2014',
'1/9/2014',
'1/10/2014',
'1/2/2015',
'1/5/2015',
'1/6/2015',
'1/7/2015',
'1/8/2015',
'1/9/2015']))
# Convert column to datetime
df.dates = pd.to_datetime(df.dates)
# Store min(year) as a variable
minyear = min(df.dates).year
# Calculate the day with timedelta -365 days (might fail on 2012?)
df['offset'] = [(i + datetime.timedelta(days=-365)).date()
if i.year != minyear else None for i in df.dates]
df
返回:
dates offset
0 2014-01-03 None
1 2014-01-06 None
2 2014-01-07 None
3 2014-01-09 None
4 2014-01-10 None
5 2015-01-02 2014-01-02
6 2015-01-05 2014-01-05
7 2015-01-06 2014-01-06
8 2015-01-07 2014-01-07
9 2015-01-08 2014-01-08
10 2015-01-09 2014-01-09
非常感谢你的回答-列表理解对我来说是新的-你能少一点简约主义吗?+1解释你的方法。这并不能解决问题。在你上面的例子中,“偏移量”-column2输出包含6个日期。但其中只有3个日期也出现在column1中。我需要的东西只能在column 1中出现的完整日期组中为column2选择一个偏移日期。很抱歉,我不够精确,我相应地调整了问题。@sudonym yep这使事情变得更复杂。不幸的是,我需要工作我暂时不知道该怎么办,也帮不上你的忙。再仔细阅读你的问题,我的回答毫无意义:/
dates offset
0 2014-01-03 None
1 2014-01-06 None
2 2014-01-07 None
3 2014-01-09 None
4 2014-01-10 None
5 2015-01-02 2014-01-02
6 2015-01-05 2014-01-05
7 2015-01-06 2014-01-06
8 2015-01-07 2014-01-07
9 2015-01-08 2014-01-08
10 2015-01-09 2014-01-09