时间类型数据处理:基于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

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

    作者:秀儿还能再秀

    物联沃分享整理
    物联沃-IOTWORD物联网 » 时间类型数据处理:基于Python的datetime库和pandas库

    发表回复