前回、TwitterAPIを用いてツイートを取得しました!が、タイムゾーンがイギリス時間(UTC)になっていました。
なので、今回はタイムゾーンを日本時間(JST)に変更する方法を調べて実装してみました。
前回のツイート取得についての記事はこちら↓

目標
取得したTweetの情報のうち、投稿時間をイギリス時間から日本時間に変更する。
方法
書式化文字列→datetime型に変換
TwitterAPIで取得したツイートの投稿時間は’Thr Feb 24 05:40:51 +0000 2022’というような文字列の形式で取得できました。
これをdatetime型に変換することで扱いやすくなり、タイムゾーンの変更ができるようです。
datetime.strptime()メソッドで日付や時刻に対応する書式文字列からdatetime型へ変換することができるので、これを使います。
>>> from datetime import datetime
>>> utc_time = datetime.datetime.strptime('Thr Feb 24 05:40:51 +0000 2022', '%a %b %d %H:%M:%S %z %Y')
>>> utc_time
datetime.datetime(2022, 2, 24, 5, 40, 51, tzinfo=datetime.timezone.utc)
2行目のように書式化された日付文字列とそのフォーマットを与えると、datetime型に変換されます。
書式化された日付や時刻の文字列を表すコードは以下のとおりです。
| 指定子 | 意味 | 使用例 |
|---|---|---|
%a | ロケールの曜日名を短縮形で表示します。 | Sun, Mon, …, Sat (en_US);So, Mo, …, Sa (de_DE) |
%A | ロケールの曜日名を表示します。 | Sunday, Monday, …, Saturday (en_US);Sonntag, Montag, …, Samstag (de_DE) |
%w | 曜日を10進表記した文字列を表示します。0 が日曜日で、6 が土曜日を表します。 | 0, 1, …, 6 |
%d | 0埋めした10進数で表記した月中の日にち。 | 01, 02, …, 31 |
%b | ロケールの月名を短縮形で表示します。 | Jan, Feb, …, Dec (en_US);Jan, Feb, …, Dez (de_DE) |
%B | ロケールの月名を表示します。 | January, February, …, December (en_US);Januar, Februar, …, Dezember (de_DE) |
%m | 0埋めした10進数で表記した月。 | 01, 02, …, 12 |
%y | 0埋めした10進数で表記した世紀無しの年。 | 00, 01, …, 99 |
%Y | 西暦 (4桁) の 10 進表記を表します。 | 0001, 0002, …, 2013, 2014, …, 9998, 9999 |
%H | 0埋めした10進数で表記した時 (24時間表記)。 | 00, 01, …, 23 |
%I | 0埋めした10進数で表記した時 (12時間表記)。 | 01, 02, …, 12 |
%p | ロケールの AM もしくは PM と等価な文字列になります。 | AM, PM (en_US);am, pm (de_DE) |
%M | 0埋めした10進数で表記した分。 | 00, 01, …, 59 |
%S | 0埋めした10進数で表記した秒。 | 00, 01, …, 59 |
%f | 10進数で表記したマイクロ秒 (左側から0埋めされます)。 | 000000, 000001, …, 999999 |
%z | UTCオフセットを ±HHMM[SS[.ffffff]] の形式で表示します (オブジェクトがnaiveであれば空文字列)。 | (空文字列), +0000, -0400, +1030, +063415, -030712.345216 |
%Z | タイムゾーンの名前を表示します (オブジェクトがnaiveであれば空文字列)。 | (空文字列), UTC, GMT |
%j | 0埋めした10進数で表記した年中の日にち。 | 001, 002, …, 366 |
%U | 0埋めした10進数で表記した年中の週番号 (週の始まりは日曜日とする)。新年の最初の日曜日に先立つ日は 0週に属するとします。 | 00, 01, …, 53 |
%W | 0埋めした10進数で表記した年中の週番号 (週の始まりは月曜日とする)。新年の最初の月曜日に先立つ日は 0週に属するとします。 | 00, 01, …, 53 |
%c | ロケールの日時を適切な形式で表します。 | Tue Aug 16 21:30:00 1988 (en_US);Di 16 Aug 21:30:00 1988 (de_DE) |
%x | ロケールの日付を適切な形式で表します。 | 08/16/88 (None);08/16/1988 (en_US);16.08.1988 (de_DE) |
%X | ロケールの時間を適切な形式で表します。 | 21:30:00 (en_US);21:30:00 (de_DE) |
%% | 文字 '%' を表します。 | % |
datetimeよりdatetime型に変換したイギリス時間(UTC)を日本時間(JST)に変換
ここからは、datetime型に変換したUTCをJSTに変換します。
dateutil.tzモジュールを使います。
from dateutil import tz
jst_time = utc_time.astimezone(tz.gettz('Asia/Tokyo'))
これでJSTに変換できました。
Tweet取得スクリプトに組み込む
ここまでで理解したことを、前回作成したツイート取得プログラムに入れ込みました。
コード全体
import os
import json
from requests_oauthlib import OAuth1Session
from dotenv import find_dotenv, load_dotenv
import pandas as pd
from datetime import datetime
from dateutil import tz
#API設定(.envファイルを別で作成し読み込んで利用)
env_file = find_dotenv()
load_dotenv(env_file)
CONSUMER_KEY = os.environ.get('CONSUMER_KEY')
CONSUMER_SECRET = os.environ.get('CONSUMER_SECRET')
ACCESS_KEY = os.environ.get('ACCESS_KEY')
ACCESS_KEY_SECRET = os.environ.get('ACCESS_KEY_SECRET')
twitter = OAuth1Session(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_KEY, ACCESS_KEY_SECRET)
url = 'https://api.twitter.com/1.1/statuses/user_timeline.json'
params = {
'count':200,
'screen_name':'アカウント名',
}
res = twitter.get(url, params=params)
timelines = json.loads(res.text)
list_created_at_utc = []
list_created_at_jst = []
list_text = []
list_favorite_count = []
#データをリストに格納。ここで投稿時間をdatetime型に変換
for data in timelines:
list_created_at_utc.append(datetime.datetime.strptime(data['created_at'], '%a %b %d %H:%M:%S %z %Y'))
list_text.append(data['text'])
list_favorite_count.append(data['favorite_count'])
#イギリス時間を日本時間に変換
for utc in list_created_at_utc:
list_created_at_jst.append(utc.astimezone(tz.gettz('Asia/Tokyo')))
#データごとのリストからDataframeを作成
df = pd.DataFrame({'time': list_created_at_jst,
'text': list_text,
'fav_count': list_favorite_count
})
#CSVに抽出
df.to_csv("tweets.csv")
これで、ツイート投稿時間をJSTに変換した状態で200件のツイートを取得できるようになりました。
まとめ
UTC時間をJST時間に変換することができました。
datetime型と書式化された文字列の変換は、今まで見たことあるけどよくわからない状態だったので、自分でも使ってみることができてよかったです。
datetime,dateutilは他でも今後使いそうなので、どこかのタイミングでもう少し学んでみようと思います。

