如何用Python为现有DataFrame添加当前日期列
问题描述
我还没完全搞懂DataFrame,正在学习相关课程。想在现有数据输出的旁边添加一列,每个单元格内容都是当前日期。
已经用以下代码获取了时间戳:
time = pd.Timestamp.today() print(time)
但目前只会打印这个时间戳,不知道怎么把它整合到现有脚本里。之前是把数据输出到Google Sheets后手动添加日期列的,现在希望直接通过脚本完成,让流程更简洁清晰。
现有脚本如下:
import requests import pandas as pd import gspread gc = gspread.service_account(filename='creds.json') sh = gc.open_by_key('152qSpr-4nK9V5uHOiYOWTWUx4ojjVNZMdSmFYov-n50') waveData = sh.get_worksheet(1) id_list = [ "/Belmar-Surf-Report/3683/", "/Manasquan-Surf-Report/386/", "/Ocean-Grove-Surf-Report/7945/", "/Asbury-Park-Surf-Report/857/", "/Avon-Surf-Report/4050/", "/Bay-Head-Surf-Report/4951/", "/Belmar-Surf-Report/3683/", "/Boardwalk-Surf-Report/9183/", ] res = [] for x in id_list: df = pd.read_html(requests.get("http://magicseaweed.com" + x).text)[0] values = [[x], df.columns.values.tolist(), *df.values.tolist()] ## 是不是要在这里改? res.extend(values) res.append([]) waveData.append_rows(res, value_input_option="USER_ENTERED")
我觉得应该修改values相关的代码,但不确定具体怎么改,希望得到详细解释。
解决方案与详细解释
你的思路没错,确实需要在处理values的部分修改,核心是给每一行(站点名称行、表头行、数据行)都追加日期列。下面分步骤说明修改逻辑和完整代码:
1. 提前获取当前日期
先在循环外部获取一次当前日期,避免每次循环重复生成,效率更高。可以根据需求调整日期格式:
# 只保留年月日格式,比如2024-05-20 current_date = pd.Timestamp.today().strftime('%Y-%m-%d') # 如果需要完整时间戳(包含时分秒),用下面这行 # current_date = pd.Timestamp.today()
2. 给每一行添加日期列
原脚本里的values包含三类行:站点名称行、表头行、DataFrame数据行,需要分别给这三类行追加日期:
- 站点名称行:原
[x]是单列数据,修改为[x, current_date],变成两列(站点+日期) - 表头行:在原有表头末尾追加
采集日期作为新列的表头 - 数据行:给DataFrame的每一行数据末尾追加当前日期
方式一:直接处理列表(对应你原脚本的逻辑)
修改循环内的代码:
for x in id_list: df = pd.read_html(requests.get("http://magicseaweed.com" + x).text)[0] # 处理各类行,添加日期列 site_row = [x, current_date] # 站点行加日期 header_row = df.columns.tolist() + ['采集日期'] # 表头加日期列名 data_rows = [list(row) + [current_date] for row in df.values] # 每一行数据加日期 values = [site_row, header_row, *data_rows] res.extend(values) res.append([]) # 保留原有的空行分隔不同站点数据
方式二:用DataFrame自带的列添加方法(更贴合DataFrame学习)
如果你想练习DataFrame的操作,可以先给df直接添加一列,再提取数据:
for x in id_list: df = pd.read_html(requests.get("http://magicseaweed.com" + x).text)[0] df['采集日期'] = current_date # 直接给DataFrame新增日期列 site_row = [x, current_date] header_row = df.columns.tolist() # 此时表头已经包含"采集日期" data_rows = df.values.tolist() # 数据行也已经包含日期 values = [site_row, header_row, *data_rows] res.extend(values) res.append([])
3. 完整修改后的脚本
import requests import pandas as pd import gspread gc = gspread.service_account(filename='creds.json') sh = gc.open_by_key('152qSpr-4nK9V5uHOiYOWTWUx4ojjVNZMdSmFYov-n50') waveData = sh.get_worksheet(1) id_list = [ "/Belmar-Surf-Report/3683/", "/Manasquan-Surf-Report/386/", "/Ocean-Grove-Surf-Report/7945/", "/Asbury-Park-Surf-Report/857/", "/Avon-Surf-Report/4050/", "/Bay-Head-Surf-Report/4951/", "/Belmar-Surf-Report/3683/", "/Boardwalk-Surf-Report/9183/", ] # 提前获取当前日期,格式可自定义 current_date = pd.Timestamp.today().strftime('%Y-%m-%d') res = [] for x in id_list: df = pd.read_html(requests.get("http://magicseaweed.com" + x).text)[0] # 方式二:用DataFrame添加列的方式(推荐,更符合DataFrame用法) df['采集日期'] = current_date site_row = [x, current_date] header_row = df.columns.tolist() data_rows = df.values.tolist() values = [site_row, header_row, *data_rows] res.extend(values) res.append([]) waveData.append_rows(res, value_input_option="USER_ENTERED")
关键逻辑解释
- 提前获取日期:所有站点的数据都是同一时间采集的,一次生成日期即可,避免冗余操作
- 站点行同步加日期:保证Google Sheets里站点名称和日期列对齐
- DataFrame添加列:这是DataFrame的基础操作之一,直接给df新增列后,后续提取表头和数据时会自动包含这一列,比手动处理列表更简洁
- 保留空行分隔:原脚本的
res.append([])用来分隔不同站点的数据,修改后保留这个逻辑,让输出到Google Sheets的数据可读性更好
内容的提问来源于stack exchange,提问作者Anthony Madle
相关产品推荐
相关产品推荐

