You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中CSV日期(dd/mm/yyyy)转天数及DataFrame指定区间天数计算

1. 转换CSV中dd/mm/yyyy格式日期为当年天数

用pandas是最高效的处理方式,直接解析日期并提取当年序数:

import pandas as pd

# 读取CSV时直接解析日期列,dayfirst=True适配dd/mm/yyyy格式
df = pd.read_csv("your_data.csv", parse_dates=["date_col"], dayfirst=True)

# 生成当年天数列,自动处理闰年
df["day_of_year"] = df["date_col"].dt.dayofyear

如果不用pandas,用标准库datetime处理:

from datetime import datetime
import csv

with open("your_data.csv", "r") as f:
    reader = csv.DictReader(f)
    for row in reader:
        # 解析dd/mm/yyyy格式的日期字符串
        date = datetime.strptime(row["date_col"], "%d/%m/%Y")
        # 获取当年天数,tm_yday自动处理闰年
        day_num = date.timetuple().tm_yday
        print(f"{row['date_col']} → {day_num}")
2. 计算DataFrame中指定日期范围内的总天数(按当年序数累加)

以下函数会过滤1995-01-01至2019-12-31的日期,计算每个日期的当年序数并求和,自动处理闰年:

import pandas as pd

def sum_day_of_year(df):
    # 确保"days"列转为datetime类型,适配dd/mm/yyyy格式
    df["days"] = pd.to_datetime(df["days"], dayfirst=True)
    
    # 过滤目标日期范围
    date_mask = (df["days"] >= "1995-01-01") & (df["days"] <= "2019-12-31")
    filtered = df.loc[date_mask]
    
    # 计算每个日期的当年天数并求和
    return filtered["days"].dt.dayofyear.sum()

# 测试示例
test_df = pd.DataFrame({"days": ["01/01/1995", "01/02/1995", "31/12/2019"]})
print(sum_day_of_year(test_df))  # 输出 1 + 32 + 365 = 398

如果你的需求是计算从1995-01-01到每个日期的累计天数之和(比如1995-01-01算第1天,1995-01-02算第2天),用这个版本:

def sum_cumulative_days(df):
    df["days"] = pd.to_datetime(df["days"], dayfirst=True)
    start_date = pd.to_datetime("1995-01-01")
    date_mask = (df["days"] >= start_date) & (df["days"] <= "2019-12-31")
    filtered = df.loc[date_mask]
    
    # 计算累计天数(+1对应示例中的起始日为第1天)
    filtered["cumulative"] = (filtered["days"] - start_date).dt.days + 1
    return filtered["cumulative"].sum()

说明:dt.dayofyear和tm_yday都会自动处理闰年,比如2020年2月29会被计算为当年第60天,无需手动编写闰年判断逻辑。

内容的提问来源于stack exchange,提问作者Dera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 20:50:26