Python
datetime
python3
BeautifulSoup
Sorted

リストの中のdatetime型を基準にソートする方法

リストの中のdatetime型を基準に並び替え(ソート)をする方法

WEBスクレイピングで得たデータは最新の情報が上の方にあり、古いデータが下にある、
もしくは古い情報になればなるほど、次のページや深いページにあるということが一般的です。
そんなデータを取得するとこんな感じになります。

from datetime import datetime as dt
from pprint import pprint

sale = []
sale.append(['モンスターエナジー', '210',  '1', dt(2018, 1, 20)])
sale.append(['リンゴジュース', '120',  '1', dt(2018, 1, 18)])
sale.append(['レッドブル', '250',  '1', dt(2018, 1, 6)])
sale.append(['ジョージアエメラルドマウンテン', '100',  '1', dt(2018, 1, 5)])

pprint(sale)

# [['モンスターエナジー', '210', '1', datetime.datetime(2018, 1, 20, 0, 0)],
#  ['リンゴジュース', '120', '1', datetime.datetime(2018, 1, 18, 0, 0)],
#  ['レッドブル', '250', '1', datetime.datetime(2018, 1, 6, 0, 0)],
#  ['ジョージアエメラルドマウンテン', '100', '1', datetime.datetime(2018, 1, 5, 0, 0)]]

定期的にデータを取得して、データベースに保存する場合は、
古いデータから登録していきたいところなんですが、
WEBスクレイピングしてきたままのデータだと新しいデータから古いデータへと登録がされていってしまいますね。

ですので、このリストを並び替えてから、データベースに登録していけば
古いデータから順に登録していくことができます。
並び替えるのは sorted() を利用します。
デフォルトでは昇順に並び替えされます。
降順に並び替えたい場合は引数に reverse=True を追加します。
datetime型でも簡単に並び替えできます。

from datetime import datetime as dt
from pprint import pprint

sale = []
sale.append(['モンスターエナジー', '210',  '1', dt(2018, 1, 20)])
sale.append(['リンゴジュース', '120',  '1', dt(2018, 1, 18)])
sale.append(['レッドブル', '250',  '1', dt(2018, 1, 6)])
sale.append(['ジョージアエメラルドマウンテン', '100',  '1', dt(2018, 1, 5)])

# sample
pprint(sale)

# result1 日付の古い順で並び替え(datetime型)
sorted_sale = sorted(sale, key=lambda s: s[3])
pprint(sorted_sale)

# result2 値段が高い順(降順)に並び替え
sorted_sale = sorted(sale, key=lambda s: int(s[1]), reverse=True)
pprint(sorted_sale)

# sample
# [['モンスターエナジー', '210', '1', datetime.datetime(2018, 1, 20, 0, 0)],
#  ['リンゴジュース', '120', '1', datetime.datetime(2018, 1, 18, 0, 0)],
#  ['レッドブル', '250', '1', datetime.datetime(2018, 1, 6, 0, 0)],
#  ['ジョージアエメラルドマウンテン', '100', '1', datetime.datetime(2018, 1, 5, 0, 0)]]

# result1
# [['ジョージアエメラルドマウンテン', '100', '1', datetime.datetime(2018, 1, 5, 0, 0)],
#  ['レッドブル', '250', '1', datetime.datetime(2018, 1, 6, 0, 0)],
#  ['リンゴジュース', '120', '1', datetime.datetime(2018, 1, 18, 0, 0)],
#  ['モンスターエナジー', '210', '1', datetime.datetime(2018, 1, 20, 0, 0)]]

# result2
# [['レッドブル', '250', '1', datetime.datetime(2018, 1, 6, 0, 0)],
#  ['モンスターエナジー', '210', '1', datetime.datetime(2018, 1, 20, 0, 0)],
#  ['リンゴジュース', '120', '1', datetime.datetime(2018, 1, 18, 0, 0)],
#  ['ジョージアエメラルドマウンテン', '100', '1', datetime.datetime(2018, 1, 5, 0, 0)]]