[英]Sorting by Date string in pandas - Python 2.7
我有要按日期列排序的.csv數據。 我的日期格式如下:
每周,每季度,每年:例如, WK01Q12001
。
當我在此列上對數據框進行.sort()時,結果排序如下:
WK01Q12001, WK01Q12002, WK01Q12003, WK01Q22001, WK01Q22002, WK01Q22003, ... WK02Q12001, WK02Q12002...
例如。 這是有道理的,因為它以升序對字符串進行排序。
但是我需要按時間順序對數據進行排序,以使結果如下所示:
WK01Q12001, WK02Q12001, WK03Q12001, WK04Q12001, ... , WK01Q22001, WK02Q22001, ... WK01Q12002, WK02Q22002 ...
如何使用熊貓以這種方式對其進行排序? 也許對字符串進行反向排序? (從右到左)還是創建某種日期時間對象?
我也嘗試過使用Series()
: pd.Series([pd.to_datetime(d) for d in weeklyData['Date']])
但結果與上述.sort()
方法相同。
更新:我的DataFrame在格式上類似於Excel工作表,當前看起來如下。 我想按日期按時間排序。
Date Price Volume
WK01Q12001 32 500
WK01Q12002 43 400
WK01Q12003 55 300
WK01Q12004 58 350
WK01Q22001 33 480
WK01Q22002 40 450
.
.
.
WK13Q42004 60 400
您可以在數據框中添加一個新列,其中包含日期成分作為列表。
例如
a = ["2001", "Q2", "WK01"]
b = ["2002", "Q2", "WK01"]
c = ["2002", "Q2", "WK02"]
因此,您可以將函數應用於數據框以執行此操作...
def tolist(x):
g = re.match(r"(WK\d{2})(Q\d)(\d{4})", str(x))
return [g.group(3), g.group(2), g.group(1)]
然后...
df['datelist'] = df['Date'].apply(tolist)
這樣,您就可以按照重要順序排列的列表形式列出您的日期...
Date Price Volume datelist
0 WK01Q12001 32 500 [2001, Q1, WK01]
1 WK01Q12002 22 400 [2002, Q1, WK01]
2 WK01Q12003 42 500 [2003, Q1, WK01]
在Python中比較長度相等的列表時,比較運算符的表現良好。 因此,您可以使用標准DataFrame排序來排序數據。
因此,當您執行以下操作時,Pandas系列中的默認排序將正確運行...
df.sort('datelist')
首先使用str.replace
更改鍵的順序:
s = "WK01Q12001, WK01Q12002, WK01Q12003, WK01Q22001, WK01Q22002, WK01Q22003, WK02Q12001, WK02Q12002"
date = map(str.strip, s.split(","))
df = pd.DataFrame({"date":date, "value":range(len(date))})
df["date2"] = df.date.str.replace(r"WK(\d\d)Q(\d)(\d{4})", r"\3Q\2WK\1")
df.sort("date2")
我還能夠使用SQL非常輕松地完成日期重新格式化。 當我第一次查詢數據時,我以SELECT *, RIGHT([Date], 4) + SUBSTRING([Date], 5, 2) + LEFT([Date], 4) As 'SortedDate' FROM [Table] ORDER BY 'SortedDate' ASC
進行了SELECT *, RIGHT([Date], 4) + SUBSTRING([Date], 5, 2) + LEFT([Date], 4) As 'SortedDate' FROM [Table] ORDER BY 'SortedDate' ASC
。
使用正確的工具完成工作!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.