日期/時間在數據分析和處理中是非常常見的,因為數據可以是時間序列的形式,也可以使用時間作為索引或排序。在Python和Pyspark中,格式化日期/時間的方法有很多種。在本文中,將介紹一些常見的方法。
一、日期時間表示
在Python中,日期可以表示為一個datetime對象,它包含了日期和時間信息。例如,下面的代碼創建了一個datetime對象:
import datetime dt = datetime.datetime(2021, 10, 1, 12, 30, 0) print(dt)
輸出結果為:
2021-10-01 12:30:00
Pyspark中也有類似的日期時間格式,稱為Timestamp。例如:
from pyspark.sql.functions import current_timestamp current_time = current_timestamp() print(current_time)
輸出結果為:
2021-11-04 15:56:34.123456
二、日期格式化
1. Python中的日期格式化
Python中的datetime對象有一個strftime()方法,可以將日期格式化為字符串,具體用法如下:
dt = datetime.datetime(2021, 10, 1, 12, 30, 0) print(dt.strftime("%Y-%m-%d %H:%M:%S"))
輸出結果為:
2021-10-01 12:30:00
常用的格式化字符串如下:
%Y:四位數的年份
%m:兩位數的月份(01-12)
%d:兩位數的日(01-31)
%H:24小時制下的小時數(00-23)
%M:兩位數的分鐘數(00-59)
%S:兩位數的秒數(00-59)
還可以使用strftime()方法將日期格式化為任意想要的格式。例如:
print(dt.strftime("%A, %B %d %Y %I:%M%p"))
輸出結果為:
Friday, October 01 2021 12:30PM
2. Pyspark中的日期格式化
Pyspark中的Timestamp對象可以使用date_format()函數進行格式化。具體用法如下:
from pyspark.sql.functions import date_format current_time = current_timestamp() formatted_time = date_format(current_time, "yyyy-MM-dd HH:mm:ss") print(formatted_time)
輸出結果為:
2021-11-04 15:56:34
同樣地,可以使用date_format()函數將日期格式化為任意想要的格式。例如:
print(date_format(current_time, "yyyy-MM-dd EEEE"))
輸出結果為:
2021-11-04 Thursday
三、日期解析
在數據處理中,從字符串解析日期也是非常常見的任務。Python中可以使用strptime()方法解析字符串為datetime對象。例如:
str_time = "2021-10-01 12:30:00" dt = datetime.datetime.strptime(str_time, "%Y-%m-%d %H:%M:%S") print(dt)
輸出結果為:
2021-10-01 12:30:00
常用的解析格式如下:
%Y:四位數的年份
%m:兩位數的月份(01-12)
%d:兩位數的日(01-31)
%H:24小時制下的小時數(00-23)
%M:兩位數的分鐘數(00-59)
%S:兩位數的秒數(00-59)
Pyspark中同樣可以使用to_timestamp()函數將字符串解析為Timestamp對象。例如:
from pyspark.sql.functions import to_timestamp str_time = "2021-11-04 15:56:34" ts = to_timestamp(str_time, "yyyy-MM-dd HH:mm:ss") print(ts)
輸出結果為:
2021-11-04 15:56:34
四、時區處理
在實際場景中,我們可能需要將日期時間的時區進行轉換。Python中可以使用pytz庫,Pyspark中則可以使用from_utc_timestamp()函數。
1. Python中時區轉換
例如,將UTC時間轉換為北京時間:
import pytz utc_time = datetime.datetime.utcnow() beijing_time = utc_time.astimezone(pytz.timezone("Asia/Shanghai")) print(beijing_time)
輸出結果為:
2021-11-04 23:47:20.164107+08:00
可以根據需要設置不同的時區。
2. Pyspark中時區轉換
例如,將UTC時間戳轉換為北京時間:
from pyspark.sql.functions import from_utc_timestamp utc_time = "2021-11-04 15:56:34" zone_offset = 8 * 3600 # 北京時間比UTC時間快8個小時,以秒為單位 beijing_time = from_utc_timestamp(utc_time, "UTC").cast("timestamp") + zone_offset print(beijing_time)
輸出結果為:
2021-11-04 23:56:34
五、常見日期時間處理場景
1. 計算日期時間差
在Python中,可以使用datetime.timedelta對象計算日期時間差。例如:
dt1 = datetime.datetime(2021, 10, 1, 12, 30, 0) dt2 = datetime.datetime(2021, 11, 4, 15, 30, 0) time_diff = dt2 - dt1 print(time_diff) print(time_diff.days) # 相差的天數 print(time_diff.seconds) # 相差的秒數
輸出結果為:
34 days, 3:00:00
34
10800
在Pyspark中,可以使用unix_timestamp()函數計算兩個Timestamp對象的差值。例如:
from pyspark.sql.functions import unix_timestamp t1 = "2021-11-04 15:56:34" t2 = "2021-11-05 11:30:30" time_diff = unix_timestamp(t2) - unix_timestamp(t1) print(time_diff)
輸出結果為:
76416
2. 將日期時間舍入到指定單位
在Python中,可以使用dateutil庫的round()函數將日期時間舍入到指定單位。例如:
import dateutil dt = datetime.datetime(2021, 11, 4, 15, 30, 0) rounded_time = dateutil.parser.parse(dt.strftime("%Y%m%d%H")) + datetime.timedelta(hours=(dt.hour // 6) * 6) print(rounded_time)
輸出結果為:
2021-11-04 12:00:00
在Pyspark中,可以使用date_trunc()函數將Timestamp對象舍入到指定單位。例如:
from pyspark.sql.functions import date_trunc ts = "2021-11-04 15:56:34" rounded_time = date_trunc("hour", ts) # 舍入到小時 print(rounded_time)
輸出結果為:
2021-11-04 15:00:00
六、總結
本文介紹了Python和Pyspark中的日期時間格式化、解析和時區處理方法,以及一些常見的日期時間處理場景。不同的場景需要使用合適的方法進行處理。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/276169.html