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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自: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()函数

 

import pandas as pd import matplotlib.pyplot as plt from astropy.time import Time import numpy as np # 文件路径 file_path = '20211229_FY_2G_SX_L2.txt' # 常量定义 h = 6.626e-34 # 普朗克常数 (J·s) c = 3.0e8 # 光速 (m/s) eV_to_J = 1.602e-19 # 1 eV 转换为 J # 计算平均能量(单位:J) E_SX1 = ((1.8 + 12.9) / 2) * 1000 * eV_to_J E_SX2 = ((3.1 + 26.1) / 2) * 1000 * eV_to_J # 读取文件,指定编码并跳过非数据行 data = pd.read_csv( file_path, delim_whitespace=True, comment='#', names=["Date", "Time", "SX1", "SX2"], skiprows=8, encoding='ISO-8859-1' ) # 合并日期时间列 data['Datetime'] = pd.to_datetime(data['Date'] + ' ' + data['Time']) # 转换 SX1 SX2 数据为浮点数 data['SX1'] = pd.to_numeric(data['SX1'], errors='coerce') data['SX2'] = pd.to_numeric(data['SX2'], errors='coerce') # 计算光子数密度 data['Photon_SX1'] = data['SX1'] / E_SX1 data['Photon_SX2'] = data['SX2'] / E_SX2 # 将常规的日期时间转换为儒略时间 data['Julian_Time'] = Time(data['Datetime']).jd # 设置合适的 bin 宽度 bin_width = 0.1 # 设置 bin 宽度为 0.1 天(根据数据选择合适的值) # 将时间数据分为 bins bins = np.arange(min(data['Julian_Time']), max(data['Julian_Time']), bin_width) # 计算每个 bin 中的光子数密度平均值 photon_SX1_binned = np.histogram(data['Julian_Time'], bins=bins, weights=data['Photon_SX1'])[0] / np.histogram(data['Julian_Time'], bins=bins)[0] photon_SX2_binned = np.histogram(data['Julian_Time'], bins=bins, weights=data['Photon_SX2'])[0] / np.histogram(data['Julian_Time'], bins=bins)[0] # 获取 bin 的中间值 bin_centers = 0.5 * (bins[:-1] + bins[1:]) # 归一化数据(将数据除以最大值) photon_SX1_binned /= np.max(photon_SX1_binned) photon_SX2_binned /= np.max(photon_SX2_binned) # 绘制光子数变化曲线 plt.figure(figsize=(12, 6)) plt.plot(bin_centers, photon_SX1_binned, label='Normalized Photon SX1 (PC)', color='black', alpha=0.7) plt.plot(bin_centers, photon_SX2_binned, label='Normalized Photon SX2 (PC)', color='red', alpha=0.7) plt.title('Normalized (FY-2G)', fontsize=14) plt.xlabel(' (JD)', fontsize=12) plt.ylabel('Normalized Optical Word Density', fontsize=12) plt.legend() plt.grid(alpha=0.3) plt.tight_layout() plt.show()
03-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值