当前位置: 首页 > article >正文

时间类型数据处理:基于Python的datetime库和pandas库

一、datetime库常用方法

日期的数据类型主要有两种:一是包含时间的datetime类型,二是不包含时间的date类型。这里的时间指具体的时、分、秒、甚至毫秒。

1、自定义日期、时间、获取本地时间、获取本地日期、获取年份、月份、月号、小时、分钟、秒、星期几

获取日期和时间的不同部分:

  • 获取年份:datetime.year
  • 获取月份:datetime.month
  • 获取月号:datetime.day
  • 获取小时:datetime.hour
  • 获取分钟:datetime.minute
  • 获取秒:datetime.second
  • 获取微妙:datetime.microsecond
  • 获取星期几,返回 0(周一)到 6(周日):datetime.weekday()
from datetime import datetime, date

# 自定义日期,形如 2022-02-20
date(2022, 2, 20)

# 自定义日期和时间,形如2025-01-22 12:00:00
dt = datetime(2025, 1, 22, 12, 00, 00)

# 获取本地日期, 形如 2025-01-23
date.today()

# 获取本地日期和时间,形如 2025-01-23 23:36:15.461326
dt = datetime.now()
dt = datetime.today()  # 与datetime.now()相同

# 获取年份
dt.year

# 获取月份
dt.month

# 获取月号
dt.day

# 获取小时
dt.hour

# 获取分钟
dt.minute

# 获取秒
dt.second

# 获取星期几
dt.weekday()   # 返回0~6,表示周一到周日

2、日期的加减(包含时间或不包含时间):需要用到一个数据类型,timedelta(时间增量),表示时间间隔或者时间差,用于执行日期和时间的加减操作。

datetime类型时间的加减操作:

# 日期和时间(即datetime类型)的加减操作演示
from datetime import datetime, timedelta

# 创建当前时间,datetime类型
now = datetime.now()

# timedelta(days, weeks, hours, minutes, seconds): 创建一个timedelta对象,表示时间间隔
td = timedelta(days=5)

# 计算5天后的时间
future = now + td    # 返回的是datetime类型

# 计算日期差值
t = now - future   # 注意的是,两个datetime格式只能相减,但相减返回值类型是timedelta类型
print("Difference:", t)   # 输出 "-5 days, 0:00:00",即相差的天数

# timedelta类型可以通过timedelta.days、timedelta.seconds等获取特定的值
print("Days difference:", t.days)   # 获取t的天数,输出-5
# 其他可用属性
print("Seconds:", t.seconds)   # 获取t的秒数,输出0

date类型的日期加减操作: 

# 日期(即date类型)的加减操作演示
from datetime import date, timedelta

# 创建一个日期对象
today = date.today()
print("Today:", today)   # 输出 Today: 2025-01-23

# 创建一个timedelta对象,表示时间间隔
td = timedelta(days=5)

# 计算5天后的日期
future_date = today + td
print("Future Date:", future_date)   # 输出 Future Date: 2025-01-28

# 计算5天前的日期
past_date = today - td
print("Past Date:", past_date)    # 输出 Past Date: 2025-01-18

# 两个date类型也是只能相减,不能相加,相减得到一个timedelta类型时间增量
print(future_date - past_date)   # 输出 10 days, 0:00:00

3、字符串转日期时间、日期时间格式化输出

常见的格式符号:

  • %Y:四位数的年份(例如 2023)
  • %m:两位数的月份(例如 01 至 12)
  • %d:两位数的日期(例如 01 至 31)
  • %H:小时(24小时制,00 至 23)
  • %M:分钟(00 至 59)
  • %S:秒(00 至 59)
  • %f:微秒(000000 至 999999)
  • %a:简短的星期几(例如 Mon)
  • %A:完整的星期几(例如 Monday)
from datetime import datetime

# 将字符串转日期时间
time = '2025-01-22 12:45:30'
dt = datetime.strptime(time, '%Y-%m-%d %H:%M:%S')
print(type(dt))  # <class 'datetime.datetime'>
print(dt)    # 输出 2025-01-22 12:45:30

# 将日期时间转字符串
time_str = dt.strftime('%Y-%m-%d %H:%M:%S %A')
print(type(time_str))    # <class 'str'>
print(time_str)  # 2025-01-22 12:45:30 Wednesday

二、pands库中常用于时间分析的方法

1、使用pd.to_datetime()转换时间列

import pandas as pd

# 创建包含日期字符串的 DataFrame
data = {'date': ['2023-01-01', '2023-01-02', '2023-01-03'],
        'value': [10, 15, 20]}

df = pd.DataFrame(data)

# 将 'date' 字符串列转换为 datetime 类型
df['date'] = pd.to_datetime(df['date'])

print(df)
# 输出:
#      date       value
# 0 2023-01-01     10
# 1 2023-01-02     15
# 2 2023-01-03     20

2、使用pd.date_range()创建时间序列

date_range()常用参数说明:

  • start:必需参数,指定日期范围的开始日期(字符串或datetime对象)
  • end:可选参数,指定日期范围的结束日期(字符串或datetime对象)
  • periods:可选参数,指定生成的日期数量,而不是通过结束日期来确定结束
  • freq:可选参数,指定日期的频率(默认频率是'D',即每天),如天、小时、月等。

常见的频率表示法有:

  • 'D':每天
  • 'B':工作日(周一到周五)
  • 'h':每小时
  • 'T''min':每分钟
  • 's':每秒
  • 'MS':每月(每月初)
  • 'ME':每月(每月末)
  • 'QS':每季度(每季度初)
  • 'QE':每季度(每季度末)
  • 'YS':每年(每年末)
  • 'YE':每年(每年末)
  • 'W':每周(每周的周日)

示例:

import pandas as pd

# 生成日期范围,使用了end参数就不能用periods参数
dates = pd.date_range('2023-01-01', end='2023-01-03', freq='D')
print(dates)   # 输出 DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03'])

# 生成日期范围,使用了periods参数就不能用end参数
dates = pd.date_range('2023-01-01', periods=3, freq='ME')
print(dates)   # 输出 DatetimeIndex(['2023-01-31', '2023-02-28', '2023-03-31'])

3、使用df.set_index()和df.resample()进行重采样

假设你有一个包含日期和数值的 DataFrame,现在你想按月重采样并使用聚合函数计算每月的平均值:

# 创建包含日期和数值的 DataFrame
data = {'date': ['2023-01-01', '2023-01-15', '2023-02-01', '2023-02-15'],
        'value': [10, 20, 30, 40]}

df = pd.DataFrame(data)

# 将 'date' 列转换为 datetime 类型并设置为索引
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)

# 按月重采样并计算平均值
df_resampled = df.resample('ME').mean()

print(df_resampled)

# 输出:
#             value
# date             
# 2023-01-31   15.0     表示一月份的平均值
# 2023-02-28   35.0     表示二月份的平均值

4、使用df.rolling()计算移动平均

假设你有一个时间序列数据,你想计算3天的移动平均:

# 创建一个时间序列数据
data = {'date': pd.date_range('2023-01-01', periods=6, freq='D'),
        'value': [10, 20, 30, 40, 50, 60]}

df = pd.DataFrame(data)
df.set_index('date', inplace=True)

# 计算3天移动平均
df['rolling_mean'] = df['value'].rolling(window=3).mean()

print(df)

# 输出:
#             value      rolling_mean
# date                           
# 2023-01-01     10           NaN
# 2023-01-02     20           NaN
# 2023-01-03     30          20.0
# 2023-01-04     40          30.0
# 2023-01-05     50          40.0
# 2023-01-06     60          50.0

5、使用df.diff()计算差值

假设你想计算每一天与前一天的差值(即变化量):

# 创建一个时间序列数据
data = {'date': pd.date_range('2023-01-01', periods=6, freq='D'),
        'value': [10, 20, 30, 40, 50, 60]}

df = pd.DataFrame(data)
df.set_index('date', inplace=True)

# 计算每日变化量
df['daily_change'] = df['value'].diff()

print(df)

# 输出:
#               value     daily_change
# date                           
# 2023-01-01     10           NaN
# 2023-01-02     20          10.0
# 2023-01-03     30          10.0
# 2023-01-04     40          10.0
# 2023-01-05     50          10.0
# 2023-01-06     60          10.0

6、使用 df.between_time() 筛选时间范围(无法筛选特定日期范围数据)

假设你有一个包含日期时间的 DataFrame,现在你想筛选某一特定时间范围内的数据:

# 创建包含日期时间数据的 DataFrame
data = {'datetime': pd.date_range('2023-01-01 08:00', periods=6, freq='h'),
        'value': [10, 20, 30, 40, 50, 60]}

df = pd.DataFrame(data)
df.set_index('datetime', inplace=True)

# 筛选 09:00 到 17:00 之间的数据
df_filtered = df.between_time('09:00', '17:00')

print(df_filtered)
# 输出:
#                        value
# datetime                  
# 2023-01-01 09:00:00     20
# 2023-01-01 10:00:00     30
# 2023-01-01 11:00:00     40
# 2023-01-01 12:00:00     50
# 2023-01-01 13:00:00     60

7、使用 .iloc 筛选特定日期范围内的数据

# 创建包含日期时间数据的 DataFrame
data = {'datetime': pd.date_range('2023-01-01 08:00', periods=5, freq='ME'),
        'value': [10, 20, 30, 40, 50]}

df = pd.DataFrame(data)
df.set_index('datetime', inplace=True)

# 筛选特定日期范围的数据
start_date = '2023-01-01'
end_date = '2023-10-02'

df_filtered = df.loc[start_date:end_date]

print(df_filtered)
# 输出:
#                        value
# datetime                  
# 2023-01-31 08:00:00     10
# 2023-02-28 08:00:00     20
# 2023-03-31 08:00:00     30
# 2023-04-30 08:00:00     40
# 2023-05-31 08:00:00     50

# 文章如有错误,欢迎大家指正,我们下期文章见。


http://www.kler.cn/a/516693.html

相关文章:

  • OpenEuler学习笔记(八):安装OpenEuler
  • 09_异步加载_单例模式_常量类配置_不可销毁
  • STM32_SD卡的SDIO通信_基础读写
  • HMV Challenges 022 Writeup
  • 【LeetCode】--- MySQL刷题集合
  • sentinel微服务保护
  • JVM之Java编译到执行(1)--引
  • 教育培训微信小程序ssm+论文源码调试讲解
  • CBAM-2018学习笔记
  • 如何使 LLaMA-Factory 支持 google/gemma-2-2b-jpn-it 的微调
  • 网络(二)协议
  • GIT的常规使用
  • 【MySQL — 数据库增删改查操作】深入解析MySQL的create insert 操作
  • docker 启动镜像命令集合
  • Java 大视界 -- Java 大数据中的异常检测技术与应用(61)
  • ESP8266 OTA固件启动日志里分区解析【2M flash】
  • 【Java实现 通过Easy Excel完成对excel文本数据的读写】
  • 递归的本质
  • Rman还原
  • Yii框架中的Cart组件:实现购物车功能
  • GC(垃圾回收)的分类
  • 使用 Elasticsearch 导航检索增强生成图表
  • linux-centosubuntu本地源配置
  • 蓝桥杯练习日常|c/c++竞赛常用库函数
  • 使用Python爬虫获取1688店铺所有商品信息的完整指南
  • C#高级:常用的扩展方法大全