如何在Pandas日期列中添加天数

514 阅读4分钟

问题的提出和解决方案概述

本文将向你展示如何向Pandas数据框架的日期列添加天数。

为了让它更有趣,我们有以下的运行场景。

CheckersTV是一个提供流媒体新闻和游戏的新频道。他们有一个庞大的用户群,每人每月支付12.99美元的费用。为了会计的目的,他们想在帐单日期上增加三(3)天。

CSV文件摘录

idfnamelname费用收费_日期
31250萨米德罗弗11.9811/21/22
31251薇妮迪克西12.9812/23/22
31252马蒂史密斯11.9809/14/22
31253乍得琼斯12.9806/18/22

💬 问题:我们如何编写代码来为Pandas DataFrame日期列添加天数*?*

我们可以通过以下选项之一来完成这项任务。


准备工作

在前进之前,请确保Pandas库已经安装。

然后,在每个脚本的顶部添加以下代码。这段代码将使本文中的代码能够无误运行。

import pandas as pd

导入Pandas库后,通过调用简码(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'] 并输出到终端。

idfnamelname费用收费_日期
31250萨米德罗弗11.982022-11-24
31251薇妮迪克西12.982022-12-26
31252马蒂史密斯11.982022-09-17
31253乍得琼斯12.982022-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'] ,并输出到终端。

idfnamelname费用收费_日期
31250萨米德罗弗11.982022-11-24
31251薇妮迪克西12.982022-12-26
31252马蒂史密斯11.982022-09-17
31253乍得琼斯12.982022-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'] ,并输出到终端。

idfnamelname费用收费日期新收费日期
31250萨米卓夫11.9811/21/222022-11-24
31251汪妮迪克西12.9812/23/222022-12-26
31252马蒂史密斯11.9809/14/222022-09-17
31253乍得琼斯12.9806/18/222022-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'] 并输出到终端。

idfnamelname费用收费日期新收费日期
31250萨米卓夫11.9811/21/222022-11-24
31251汪妮迪克西12.9812/23/222022-12-26
31252马蒂史密斯11.9809/14/222022-09-17
31253乍得琼斯12.9806/18/222022-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数据框架列中最常见的元素,以选择最适合你的编码要求。

祝您好运,编码愉快!