pandas的日期时间间隔运算(pd.to_datetime和pd.to_numeric)

本文介绍如何使用Python的pandas库进行日期的运算和转换,包括将字符串格式的日期转换为日期格式,计算两组时间之间的间隔,并将计算结果转换为整数型数据,以及处理负数时间间隔的转换。
部署运行你感兴趣的模型镜像

转载自:https://www.jianshu.com/p/26c48361ed24

有时,我们需要对日期进行简单的运算,这就要使用到了日期运算和转换的函数。

例如:

源数据

其中使用pd.to_datetime可以统一将time.strftime("%Y/%m/%d")生成的日期转换成日期格式的数据。time.strftime("%Y/%m/%d")生成的日期为字符串格式。

一、计算两组时间之间的间隔

在图中有两列的日期,我们可以直接求出它们之间的间隔,在计算之前要先确定一下日期列的数据是否是日期格式:

数据格式

确定了都是日期格式就可以进行日期的计算:

日期的计算

 

计算后的日期天数

由上图可知,计算后的日期天数却有着一个days单位,这个 因为这个是属于timedelta64[ns]的数据属性:

计算后的数据属性

因此我们可以将其转换成整数,以方便我们后续的使用:

将数据类型转换成整数型

使用pd.to_numeric可以将其它形式的数据转换成整数型的数据。

我们在看看现在数据的类型:

转换后的数据类型

当然了,也可以使用函数来进行转换:

用匿名函数转换成整数型

使用匿名函数的时候对每个元素使用一次.days就能将数据转换成整数。

timedelta的数据类型相互直接不能转换成年、周、月等,只能转换为天数、秒数、微妙数。而且在返回秒数和微笑数时,如果是负数时容易出错(例如:-3秒会被处理为-1天86397秒):

源数据

在两个日期直接进行计算之后:

计算之后的数据

所以在日期计算之后为负数的时候就会出错,因此在转换间隔秒数的时候最后使用total_seconds()函数(记得函数后面的括号):

使用total_seconds()函数

 

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from datetime import datetime # 设置中文字体图表样式 plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS'] plt.rcParams['axes.unicode_minus'] = False sns.set_style("whitegrid") sns.set_palette("husl") def load_and_preprocess_data(file_path, sheet_names=None): """ 加载并预处理数据 参数: file_path (str): Excel文件路径 sheet_names (list): sheet名称列表,默认为['科创板', '北交所'] 返回: tuple: (科创板DataFrame, 北交所DataFrame) """ if sheet_names is None: sheet_names = ['科创板', '北交所'] try: print(f"正在加载文件: {file_path}") # 读取两个sheet df_kcb = pd.read_excel(file_path, sheet_name=sheet_names[0], header=[0, 1], index_col=0) df_bse = pd.read_excel(file_path, sheet_name=sheet_names[1], header=[0, 1], index_col=0) print(f"科创板数据形状: {df_kcb.shape}") print(f"北交所数据形状: {df_bse.shape}") # 检查数据是否为空 if df_kcb.empty or df_bse.empty: print("警告: 数据为空") return None, None # 处理索引日期格式 df_kcb.index = pd.to_datetime(df_kcb.index) df_bse.index = pd.to_datetime(df_bse.index) # 按日期排序 df_kcb = df_kcb.sort_index() df_bse = df_bse.sort_index() print("数据加载预处理完成") return df_kcb, df_bse except FileNotFoundError: print(f"错误: 找不到文件 '{file_path}'") return None, None except Exception as e: print(f"数据加载错误: {e}") return None, None def calculate_daily_returns(df): """ 计算每只股票的每日收益率(基于1元初始资金) """ # 提取收盘价数据(跳过第一层多级索引) close_prices = df.xs('收盘价', axis=1, level=1) # 计算每日收益率 daily_returns = close_prices.pct_change().fillna(0) # 计算累计收益率(从1元开始) cumulative_returns = (1 + daily_returns).cumprod() # 转换为百分比收益率 (累计收益 - 1) * 100% cumulative_returns_pct = (cumulative_returns - 1) * 100
10-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值