问题的提出和解决方案概述
本文将向你展示如何向Pandas数据框架的日期列添加天数。
为了让它更有趣,我们有以下的运行场景。
CheckersTV是一个提供流媒体新闻和游戏的新频道。他们有一个庞大的用户群,每人每月支付12.99美元的费用。为了会计的目的,他们想在帐单日期上增加三(3)天。
CSV文件摘录
| id | fname | lname | 费用 | 收费_日期 |
| 31250 | 萨米 | 德罗弗 | 11.98 | 11/21/22 |
| 31251 | 薇妮 | 迪克西 | 12.98 | 12/23/22 |
| 31252 | 马蒂 | 史密斯 | 11.98 | 09/14/22 |
| 31253 | 乍得 | 琼斯 | 12.98 | 06/18/22 |
问题:我们如何编写代码来为Pandas DataFrame日期列添加天数*?*
我们可以通过以下选项之一来完成这项任务。
- 方法1 :使用
timedelta() - 方法2 :使用
to_datetime()和timedelta() - 方法3 :使用
to_datetime()和apply() - 方法4:使用
to_datetime()和DateOffset() - 奖励:更新日期范围
准备工作
在前进之前,请确保Pandas库已经安装。
然后,在每个脚本的顶部添加以下代码。这段代码将使本文中的代码能够无误运行。
import pandas as pd
方法1:使用Timedelta()
这个例子使用了 timedelta()类,它允许你定义一个特定的时间间隔,如一天,并将其添加到一个datetime 的表达式中。
df = pd.read_csv('checkers_users.csv')
df['charge_date'] = df['charge_date'].astype('datetime64[ns]')
df['charge_date'] = df.charge_date + pd.Timedelta(days=3)
print(df)
上面的代码将checkers_users.csv 文件读入一个DataFramedf 。
下面一行将DataFrame列charge_date 转换为数据时间格式。然后,在charge_date 的每一列条目中加入三(3)天(pd.Timedelta(days=3))。结果保存到df['charge_date'] 并输出到终端。
| id | fname | lname | 费用 | 收费_日期 |
| 31250 | 萨米 | 德罗弗 | 11.98 | 2022-11-24 |
| 31251 | 薇妮 | 迪克西 | 12.98 | 2022-12-26 |
| 31252 | 马蒂 | 史密斯 | 11.98 | 2022-09-17 |
| 31253 | 乍得 | 琼斯 | 12.98 | 2022-06-21 |
方法2:使用to_datetime()和timedelta()。
这个例子使用了 to_datetime()和 timedelta()将三(3)天添加到数据框架列的每个日期条目中。
import time
from datetime import datetime, timedelta, date, time
df = pd.read_csv('checkers_users.csv')
df['charge_date'] = (pd.to_datetime(df['charge_date']) + timedelta(3))
print(df)
上面的代码导入了 time模块和其他来自datetime库的模块。
然后,将checkers_users.csv 文件读入一个DataFramedf 。
下面一行为每一列条目(timedelta(3))在charge_date 中增加三(3)天。结果保存回df['charge_date'] ,并输出到终端。
| id | fname | lname | 费用 | 收费_日期 |
| 31250 | 萨米 | 德罗弗 | 11.98 | 2022-11-24 |
| 31251 | 薇妮 | 迪克西 | 12.98 | 2022-12-26 |
| 31252 | 马蒂 | 史密斯 | 11.98 | 2022-09-17 |
| 31253 | 乍得 | 琼斯 | 12.98 | 2022-06-21 |
方法3:使用to_datetime()和apply()。
这个例子使用了 to_datetime()和 apply()为数据框架列中的每个日期条目添加三(3)天。
df = pd.read_csv('checkers_users.csv')
df['new_charge_date'] = pd.to_datetime(df['charge_date']).apply(pd.DateOffset(3))
print(df)
上面的代码将checkers_users.csv 文件读入一个DataFramedf 。
下面一行为charge_date 的每一列条目增加三(3)天(apply(pd.DateOffset(3))。结果保存到一个新的DataFrame列df['new_charge_date'] ,并输出到终端。
| id | fname | lname | 费用 | 收费日期 | 新收费日期 |
| 31250 | 萨米 | 卓夫 | 11.98 | 11/21/22 | 2022-11-24 |
| 31251 | 汪妮 | 迪克西 | 12.98 | 12/23/22 | 2022-12-26 |
| 31252 | 马蒂 | 史密斯 | 11.98 | 09/14/22 | 2022-09-17 |
| 31253 | 乍得 | 琼斯 | 12.98 | 06/18/22 | 2022-06-21 |
警告:截至本文写作时,使用Python 3.10.4,在运行这段代码时出现以下信息。
FutureWarning:DateOffset.调用已被废弃,并将在未来的版本中被删除。
方法4:使用to_datetime()和DateOffset()。
这个例子使用了 to_datetime()和 DateOffset()将三(3)天添加到DataFrame列中的每个日期条目。
df = pd.read_csv('checkers_users.csv')
df['charge_date'] = df['charge_date'].astype('datetime64[ns]')
df['charge_date'] = pd.to_datetime(df['charge_date']) + pd.DateOffset(days=3)
print(df)
上面的代码将checkers_users.csv 文件读入一个DataFramedf 。
下面一行将DataFrame列charge_date ,转换为日期时间格式。然后,在charge_date ,为每一列条目添加三(3)天(pd.DateOffset(days=3))。结果保存到df['charge_date'] 并输出到终端。
| id | fname | lname | 费用 | 收费日期 | 新收费日期 |
| 31250 | 萨米 | 卓夫 | 11.98 | 11/21/22 | 2022-11-24 |
| 31251 | 汪妮 | 迪克西 | 12.98 | 12/23/22 | 2022-12-26 |
| 31252 | 马蒂 | 史密斯 | 11.98 | 09/14/22 | 2022-09-17 |
| 31253 | 乍得 | 琼斯 | 12.98 | 06/18/22 | 2022-06-21 |
奖金:基于条件的日期变更
CheckersTV决定将客户的账单日改为三(3)天,只有当他们在特定的范围内。
import pandas as pd
import numpy as np
df = pd.read_csv('checkers_users.csv')
df['charge_date'] = df['charge_date'].astype('datetime64[ns]')
count = 0
for c in df['charge_date']:
chrg_day = int(c.strftime("%d"))
if (chrg_day >= 1 and chrg_day <= 25):
df.iat[count, 4] = pd.to_datetime(c) + pd.DateOffset(days=3)
count += 1
摘要
这篇文章提供了(4)种方法来寻找Pandas数据框架列中最常见的元素,以选择最适合你的编码要求。
祝您好运,编码愉快!