質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

9924閲覧

pythonにおける時刻のソート

tyokopontaku

総合スコア13

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2016/12/04 17:11

単純な質問です。

python3において、時刻のデータが以下のように与えられたとき古い順に並べなおすような操作はどのようなコード、または関数を用意すればできるのか教えてください

A = ["10/Feb/2013:18:57:49","10/Aug/2011:08:40:43","10/Jul/2013:14:25:52"]

古い順にソート→["10/Aug/2011:08:40:43","10/Jul/2013:14:25:52","10/Feb/2013:18:57:49"]
といった形です。

時刻の形式として 日/月/西暦:時間:分:秒 となっています
月に関してはJan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec が 1月……12月と対応しています。

時刻の並び替えはネットで調べても有効な回答が得られず扱い切れていないのが現状です。
月の部分を辞書配列に収めてソートすることしかできていません。
方針だけでもいただければ自分でコードを書いていきたいと思いますので、何卒よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

dateutilパッケージを使うのはどうでしょう。pipからインストールできます。

python3

1from dateutil.parser import parse 2 3A = ["10/Feb/2013:18:57:49","10/Aug/2011:08:40:43","10/Jul/2013:14:25:52"] 4B = [parse(x, fuzzy=True) for x in A] 5print('A =', A) 6print('B =', B) 7print('sorted(B)=', sorted(B))

text

1# 実行結果 2A = ['10/Feb/2013:18:57:49', '10/Aug/2011:08:40:43', '10/Jul/2013:14:25:52'] 3B = [datetime.datetime(2013, 2, 10, 18, 57, 49), datetime.datetime(2011, 8, 10, 8, 40, 43), datetime.datetime(2013, 7, 10, 14, 25, 52)] 4sorted(B)= [datetime.datetime(2011, 8, 10, 8, 40, 43), datetime.datetime(2013, 2, 10, 18, 57, 49), datetime.datetime(2013, 7, 10, 14, 25, 52)] 5

datetimeに変換してしまえば普通にソートできます。元の表現に戻すにはstrftime/strptimeでいけると思います。

投稿2016/12/04 17:27

sharow

総合スコア1149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

参考として、日付を文字列として扱い、無理やりソートさせる例です。
非常にコードが冗長になるため、sharow様の仰るようにdateutilパッケージ等の利用がおすすめです。

python

1WEEK = ( 2 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 3 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' 4) 5 6A = ["10/Feb/2013:18:57:49", "10/Aug/2011:08:40:43", "10/Jul/2013:14:25:52"] 7 8 9def datetime_sort(date_str): 10 date_and_time = date_str.split(':') # →['10/Feb/2013', '18', '57', '49'] 11 time = ':'.join(date_and_time[1:]) # →18:57:49 12 date = date_and_time[0] # →'10/Feb/2013' 13 year, month, day = date.split('/')[::-1] # →2013, Feb, 10 14 return (year, WEEK.index(month), day, time) 15 16A.sort(key=datetime_sort) 17print(A)

結果

python

1['10/Aug/2011:08:40:43', '10/Feb/2013:18:57:49', '10/Jul/2013:14:25:52']

タプルでの比較を使っており、第1要素、第2要素...と順番に比較がされ、ソートされます。

python

1print((year, WEEK.index(month), day, time)) 2 3# 年、月(Janが0)、日、時間 4('2013', 1, '10', '18:57:49') 5('2011', 7, '10', '08:40:43') 6('2013', 6, '10', '14:25:52')

投稿2016/12/05 01:15

toritoritorina

総合スコア972

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問