時間序列數據是數據分析中一類常見且重要的數據。 它們按照時間順序記錄,通常是從某些現象的觀察中收集的,比如經濟指標、氣象數據、股票價格、銷售數據等等。 時間序列數據的特點是有規律地隨著時間變化而變化,它們的變化趨勢可以被分析和預測。時間序列分析是一種用於預測未來值或評估過去值的統計方法,常常被用於預 ...
時間序列數據是數據分析中一類常見且重要的數據。
它們按照時間順序記錄,通常是從某些現象的觀察中收集的,比如經濟指標、氣象數據、股票價格、銷售數據等等。
時間序列數據的特點是有規律地隨著時間變化而變化,它們的變化趨勢可以被分析和預測。時間序列分析是一種用於預測未來值或評估過去值的統計方法,常常被用於預測未來趨勢、季節性變化、周期性變化、隨機波動等。
1. 日期類型
原始數據中,日期一般會存儲為各種類型字元串,比如:
- 2022/5/1
- 2022-05-02
- 3/5/2022
將其統一轉換為pandas
的日期類型,後續統計分析時,不僅方便計算,還可以有效避免應對各種格式帶來的麻煩。
1.1 轉換為日期類型
pandas
的to_datetime
函數對於數據集中各類日期字元串都能有效的轉換。
df = pd.DataFrame(
{
"日期": ["2022/5/1", "2022-05-02", "3/5/2022"],
"城市": ["合肥", "合肥", "合肥"],
"平均氣溫": [28, 31, 27],
},
)
print(df)
print(df.dtypes)
可以看出,預設的日期是字元串類型且格式混亂。
轉換後:
df["日期"] = pd.to_datetime(df["日期"])
print(df)
print(df.dtypes)
日期顯示起來格式統一了,類型也變為了datetime64[ns]
。
1.2 生成日期序列
除了將數據集讀取來的日期字元串轉換為日期類型,我們也可以生成日期序列,這些生成的日期序列可以作為的數據索引,也可以用來補充數據集中缺失的日期值。
df = pd.DataFrame()
df["年"] = pd.date_range('2020-01-01', periods=3, freq='Y')
df["月"] = pd.date_range('2020-01-01', periods=3, freq='M')
df["日"] = pd.date_range('2020-01-01', periods=3, freq='D')
df["周"] = pd.date_range('2020-01-01', periods=3, freq='W')
df["季度"] = pd.date_range('2020-01-01', periods=3, freq='Q')
df
上面的示例分別以年,月,日,周,季度為間隔,生成3條連續的時間序列。
1.3 修改日期
修改日期的值,也是利用日期類型自帶的方法,不用像修改字元串那樣修改,那樣極易出錯。
df = pd.DataFrame()
d = pd.date_range('2020-01-01', periods=3, freq='D')
df["原始日期"] = d
df["延遲三天"] = d.shift(3, freq="D")
df["提前三天"] = d.shift(-3, freq="D")
df
這裡是按天調整的,如果要按照年,月,周,季度等調整,像上一個例子那樣設置freq
參數即可。
2. 日期屬性
將數據轉換為pandas
日期類型的最大好處就是可以使用日期類型特有的屬性,方便進行各個維度的分析。
常用的日期維度是年,月,日,周,季度。
2.1 年
利用日期屬性按年份統計合計值:
df = pd.DataFrame(
{
"日期": ["2020/5/1", "2021/5/1", "2021/6/3", "2022/9/4"],
"平均氣溫": [28, 31, 27, 33],
},
)
df["日期"] = pd.to_datetime(df["日期"])
df["年"] = df["日期"].dt.year
print(df)
print(df.groupby(df["年"]).sum())
兩個2021年的數據統計了合計值。
2.2 月
按月統計合計值:
df = pd.DataFrame(
{
"日期": ["2020/5/1", "2021/5/1", "2021/6/3", "2022/9/4"],
"平均氣溫": [28, 31, 27, 33],
},
)
df["日期"] = pd.to_datetime(df["日期"])
df["月"] = df["日期"].dt.month
print(df)
print(df.groupby(df["月"]).sum())
兩個5月份的數據統計了合計值。
2.3 日
按日統計合計值:
df = pd.DataFrame(
{
"日期": ["2020/5/1", "2021/5/1", "2021/6/3", "2022/9/4"],
"平均氣溫": [28, 31, 27, 33],
},
)
df["日期"] = pd.to_datetime(df["日期"])
df["日"] = df["日期"].dt.day
print(df)
print(df.groupby(df["日"]).sum())
兩個1號的數據統計了合計值。
2.4 周
按周統計合計值:
df = pd.DataFrame(
{
"日期": ["2021/5/1", "2021/5/31", "2021/6/3", "2021/9/4"],
"平均氣溫": [28, 31, 27, 33],
},
)
df["日期"] = pd.to_datetime(df["日期"])
df["周"] = df["日期"].dt.isocalendar().week
print(df)
print(df.groupby(df["周"]).sum())
上面兩個日期同屬於第22周,所以計算了合計值。
獲取周屬性與前面略有不同,不是直接獲取week
,而是用isocalendar().week
。
2.5 季度
按季度統計合計值:
df = pd.DataFrame(
{
"日期": ["2021/5/1", "2021/5/31", "2021/6/3", "2021/9/4"],
"平均氣溫": [28, 31, 27, 33],
},
)
df["日期"] = pd.to_datetime(df["日期"])
df["季度"] = df["日期"].dt.quarter
print(df)
print(df.groupby(df["季度"]).sum())
上面3個日期都是第二季度,所以計算了合計值。
3. 總結回顧
本篇特意將pandas
中的日期類型單獨介紹,
一方面是因為日期類型與其他類型相比,多出了很多特有的屬性;
另一方面,時間序列數據和回歸分析中也會大量用到日期類型。
這裡介紹了日期類型的轉換方法和常用屬性,但日期類型不僅僅限於這些屬性,其他的屬性可以參考pandas的官方文檔:Index objects — pandas 2.0.1 documentation