在Pandas中为日期添加月份

tyky79it  于 2023-01-11  发布在  其他
关注(0)|答案(4)|浏览(193)

我试图找出如何添加3个月到一个日期在Pandas Dataframe ,同时保持它在日期格式,所以我可以用它来查找一个范围。
这是我尝试过的方法:

#create dataframe
df = pd.DataFrame([pd.Timestamp('20161011'),
                   pd.Timestamp('20161101') ], columns=['date'])

#create a future month period
plus_month_period = 3

#calculate date + future period
df['future_date'] = plus_month_period.astype("timedelta64[M]")

但是,我得到了以下错误:

AttributeError: 'int' object has no attribute 'astype'
1hdlvixo

1hdlvixo1#

您可以使用pd.DateOffset

In [1756]: df.date + pd.DateOffset(months=plus_month_period)
Out[1756]:
0   2017-01-11
1   2017-02-01
Name: date, dtype: datetime64[ns]

使用pd.offsets.MonthOffset的另一种方法

In [1785]: df.date + pd.offsets.MonthOffset(plus_month_period)
Out[1785]:
0   2016-10-14
1   2016-11-04
Name: date, dtype: datetime64[ns]

详情

In [1757]: df
Out[1757]:
        date
0 2016-10-11
1 2016-11-01

In [1758]: plus_month_period
Out[1758]: 3
rqenqsqc

rqenqsqc2#

假设您有一个以下格式的 Dataframe ,其中您必须向日期列添加整数月份。
| 开始日期|要添加的月数|
| - ------| - ------|
| 2014年6月1日|二十三|
| 2014年6月1日|四个|
| 二零零零年十月一日|十个|
| 2016年7月1日|三个|
| 2017年12月1日|九十|
| 2019年1月1日|第二章|
在这种情况下,使用Zero's codemattblack's code是没有用的。您必须在函数带有两个参数的行上使用lambda函数-
1.需要添加月份的日期
1.整数格式的月份值
您可以使用以下函数:

# Importing required modules
from dateutil.relativedelta import relativedelta

# Defining the function
def add_months(start_date, delta_period):
  end_date = start_date + relativedelta(months=delta_period)
  return end_date

之后,您可以使用以下代码片段将月份添加到Start_Date列。使用Pandasprogress_apply功能。请参阅progress_apply上的Stackoverflow答案:Progress indicator during pandas operations.

from tqdm import tqdm
tqdm.pandas()

df["End_Date"] = df.progress_apply(lambda row: add_months(row["Start_Date"], row["Months_to_add"]), axis = 1)

以下是数据集创建的完整代码表单,供您参考:

import pandas as pd
from dateutil.relativedelta import relativedelta
from tqdm import tqdm
tqdm.pandas()

# Initilize a new dataframe
df = pd.DataFrame()

# Add Start Date column
df["Start_Date"] = ['2014-06-01T00:00:00.000000000',
                    '2014-06-01T00:00:00.000000000',
                    '2000-10-01T00:00:00.000000000',
                    '2016-07-01T00:00:00.000000000',
                    '2017-12-01T00:00:00.000000000',
                    '2019-01-01T00:00:00.000000000']

# To convert the date column to a datetime format
df["Start_Date"] = pd.to_datetime(df["Start_Date"])
# Add months column
df["Months_to_add"] = [23, 4, 10, 3, 90, 2]

# Defining the Add Months function
def add_months(start_date, delta_period):
  end_date = start_date + relativedelta(months=delta_period)
  return end_date

# Apply function on the dataframe using lambda operation.
df["End_Date"] = df.progress_apply(lambda row: add_months(row["Start_Date"], row["Months_to_add"]), axis = 1)

您将得到如下所示的最终输出 Dataframe 。
| 开始日期|要添加的月数|结束日期|
| - ------| - ------| - ------|
| 2014年6月1日|二十三|2016年5月1日|
| 2014年6月1日|四个|2014年10月1日|
| 二零零零年十月一日|十个|二零零一年八月一日|
| 2016年7月1日|三个|2016年10月1日|
| 2017年12月1日|九十|二○二五年六月一日|
| 2019年1月1日|第二章|2019年3月1日|
如果上面的代码有任何问题,请添加到注解中。
一切顺利!

xxb16uws

xxb16uws3#

我认为解决这个问题最简单、最有效(更快)的方法是使用to_period(M)将日期转换为月周期,将结果与Months_to_add列的值相加,然后使用.dt.to_timestamp()命令将数据作为datetime检索。
使用由@Aruparna Maity创建的示例数据
| 开始日期|要添加的月数|
| - ------| - ------|
| 2014年6月1日|二十三|
| 2014年6月20日|四个|
| 二零零零年十月一日|十个|
| 2016年7月5日|三个|
| 二〇一七年十二月十五日|九十|
| 2019年1月1日|第二章|

df['End_Date'] = ((df['Start_Date'].dt.to_period('M')) + df['Months_to_add']).dt.to_timestamp()
df.head(6)
#output
    Start_Date  Months_to_add   End_Date
0   2014-06-01  23              2016-05-01
1   2014-06-20  4               2014-10-01
2   2000-10-01  10              2001-08-01
3   2016-07-05  3               2016-10-01
4   2017-12-15  90              2025-06-01
5   2019-01-01  2               2019-03-01

如果需要确切的日期,只需重复该过程,但将期间更改为天

df['End_Date'] = ((df['End_Date'].dt.to_period('D')) + df['Start_Date'].dt.day -1).dt.to_timestamp()
#output:
    Start_Date  Months_to_add   End_Date
0   2014-06-01  23              2016-05-01
1   2014-06-20  4               2014-10-20
2   2000-10-01  10              2001-08-01
3   2016-07-05  3               2016-10-05
4   2017-12-15  90              2025-06-15
5   2019-01-01  2               2019-03-01
ctehm74n

ctehm74n4#

使用numpy np.timedelta64的另一种方法

df['date'] + np.timedelta64(plus_month_period,'M')
    0   2017-01-10 07:27:18
    1   2017-01-31 07:27:18
    Name: date, dtype: datetime64[ns]

相关问题