如何将datetime系列中的每个日期与同一系列中最近的1年前日期进行分组?

2024-04-18 07:13:02 发布

您现在位置:Python中文网/ 问答频道 /正文

在一个数据帧中处理时间序列数据。日期时间索引不完整(即某些日期丢失)。你知道吗

我想创建一个日期时间序列为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        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

要求如下:

  1. 截至2015年1月2日的每个日期必须有相应的抵销日期(无空格)
  2. “抵消日期”组中的每个日期也必须出现在索引列中(即不希望引入新日期,如2014年1月8日

  3. 所有抵销日期必须按升序排列(日期顺序必须保留)

到目前为止我所尝试的:

  1. Dateoffset没有帮助,因为它对索引中不存在的日期不敏感。你知道吗
  2. .shift方法data["1 year offset (Output)"] = data.Index.shift(365)没有帮助,因为索引中的日期数在不同年份是不同的。你知道吗

我现在要做的有几个步骤:

  1. 首先应用Dateoffset方法创建“临时1年补偿”
  2. 使用set(list)方法从“临时1年偏移量”中删除datetimeindex中不存在的单个日期,并用NaN替换单元格

  3. 在datetimeindex中选择“临时1年偏移量”为NaN的日期,并减去一年

  4. 使用argmin

这里的挑战是,在某些情况下,我会得到两个条目以及天数的降序。这些会以以下方式影响结果(请参见第n天和第n+1天之间的timedelta):

Index (Input)   1 year offset (Output) Timedelta
4/17/2014       4/16/2014              1
4/22/2014       4/17/2014              1
4/23/2014       4/25/2014              8
4/24/2014       None
4/25/2014       4/22/2014             -3
4/28/2014       4/23/2014              1
4/29/2014       4/24/2014              1
4/30/2014       4/25/2014              1

在任何情况下,这最后一种方法似乎是对基本目标的简单性的过度关注。有没有更快更简单的方法?你知道吗

如何将datetime系列中的每个日期与同一系列中最近的一年前日期进行分组?


Tags: 数据方法noneinputoutputindexshift时间
1条回答
网友
1楼 · 发布于 2024-04-18 07:13:02

可能是这样的:

然而,看看这个线程,当一年有366天时,可以正确地处理1年: Add one year in current date PYTHON

因此,这个代码需要一些小的修改。你知道吗

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

相关问题 更多 >