簡體   English   中英

在熊貓中按日期字符串排序-Python 2.7

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM