Python pandas 将年份整数列添加到日期列
Python pandas add a years integer column to a date column
我有一个问题与这里讨论的有点相似
但是在我的例子中,添加到日期列的年数存储在另一列中。这是我的无效代码:
import datetime
import pandas as pd
df1 = pd.DataFrame( [ ["Tom",5], ['Jane',3],['Peter',1]], columns = ["Name","Years"])
df1['Date'] = datetime.date.today()
df1['Final_Date'] = df1['Date'] + pd.offsets.DateOffset(years=df1['Years'])
目标是将第 1 行的当前日期增加 5 年,将第 2 行的当前日期增加 3 年,等等。
有什么建议么?谢谢
import datetime
import pandas as pd
df1 = pd.DataFrame( [ ["Tom",5], ['Jane',3],['Peter',1]], columns = ["Name","Years"])
df1['Date'] = datetime.date.today()
df1['Final_date'] = datetime.date.today()
df1['Final_date'] = df1.apply(lambda g: g['Date'] + pd.offsets.DateOffset(years = g['Years']), axis=1)
print(df1)
试试这个,您在调用 pd.offsets.DateOffset(years=df1['Years'])
时试图添加整列,而不是仅在列中添加 1 个值。
编辑:由于 iterrows
的性能不佳,我从 iterrows
更改为矢量化方法
假设 Years 中不同值的数量是有限的,你可以尝试 groupby
并用 pd.DateOffset
进行操作,例如:
df1['new_date'] = (
df1.groupby('Years')
['Date'].apply(lambda x: x + pd.DateOffset(years=x.name))
)
print(df1)
Name Years Date new_date
0 Tom 5 2021-07-13 2026-07-13
1 Jane 3 2021-07-13 2024-07-13
2 Peter 1 2021-07-13 2022-07-13
否则您可以提取年、月和日,将 Years 列添加到 year 并重新创建 datetime 列
df1['Date'] = pd.to_datetime(df1['Date'])
df1['new_date'] = (
df1.assign(year=lambda x: x['Date'].dt.year+x['Years'],
month=lambda x: x['Date'].dt.month,
day=lambda x: x['Date'].dt.day,
new_date=lambda x: pd.to_datetime(x[['year','month','day']]))
['new_date']
)
同样的结果
通过将年转换为天,然后添加到转换后的日期时间列来转换为时间增量:
df1['Final_Date'] = pd.to_datetime(df1['Date']) \
+ pd.to_timedelta(df1['Years'] * 365, unit='D')
使用 to_timedelta
和 unit='Y'
多年是 deprecated 并抛出 ValueError
。
我有一个问题与这里讨论的有点相似
import datetime
import pandas as pd
df1 = pd.DataFrame( [ ["Tom",5], ['Jane',3],['Peter',1]], columns = ["Name","Years"])
df1['Date'] = datetime.date.today()
df1['Final_Date'] = df1['Date'] + pd.offsets.DateOffset(years=df1['Years'])
目标是将第 1 行的当前日期增加 5 年,将第 2 行的当前日期增加 3 年,等等。 有什么建议么?谢谢
import datetime
import pandas as pd
df1 = pd.DataFrame( [ ["Tom",5], ['Jane',3],['Peter',1]], columns = ["Name","Years"])
df1['Date'] = datetime.date.today()
df1['Final_date'] = datetime.date.today()
df1['Final_date'] = df1.apply(lambda g: g['Date'] + pd.offsets.DateOffset(years = g['Years']), axis=1)
print(df1)
试试这个,您在调用 pd.offsets.DateOffset(years=df1['Years'])
时试图添加整列,而不是仅在列中添加 1 个值。
编辑:由于 iterrows
的性能不佳,我从 iterrows
更改为矢量化方法
假设 Years 中不同值的数量是有限的,你可以尝试 groupby
并用 pd.DateOffset
进行操作,例如:
df1['new_date'] = (
df1.groupby('Years')
['Date'].apply(lambda x: x + pd.DateOffset(years=x.name))
)
print(df1)
Name Years Date new_date
0 Tom 5 2021-07-13 2026-07-13
1 Jane 3 2021-07-13 2024-07-13
2 Peter 1 2021-07-13 2022-07-13
否则您可以提取年、月和日,将 Years 列添加到 year 并重新创建 datetime 列
df1['Date'] = pd.to_datetime(df1['Date'])
df1['new_date'] = (
df1.assign(year=lambda x: x['Date'].dt.year+x['Years'],
month=lambda x: x['Date'].dt.month,
day=lambda x: x['Date'].dt.day,
new_date=lambda x: pd.to_datetime(x[['year','month','day']]))
['new_date']
)
同样的结果
通过将年转换为天,然后添加到转换后的日期时间列来转换为时间增量:
df1['Final_Date'] = pd.to_datetime(df1['Date']) \
+ pd.to_timedelta(df1['Years'] * 365, unit='D')
使用 to_timedelta
和 unit='Y'
多年是 deprecated 并抛出 ValueError
。