一、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
# 文章如有錯誤,歡迎大家指正,我們下期文章見。