データのタイムゾーンを変更する

python

前回、TwitterAPIを用いてツイートを取得しました!が、タイムゾーンがイギリス時間(UTC)になっていました。

なので、今回はタイムゾーンを日本時間(JST)に変更する方法を調べて実装してみました。

前回のツイート取得についての記事はこちら↓

Twitter APIでツイート取得してみた
Twitterアカウントを削除する予定だけど、その前にツイートをデータで保存しておいたりできないかな?ということでネットで検索してみたら、たくさんの人がやってました。ということで、私もいろいろな方のブログ記事などを参考に、Twit...

目標

取得した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
%d0埋めした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)
%m0埋めした10進数で表記した月。01, 02, …, 12
%y0埋めした10進数で表記した世紀無しの年。00, 01, …, 99
%Y西暦 (4桁) の 10 進表記を表します。0001, 0002, …, 2013, 2014, …, 9998, 9999
%H0埋めした10進数で表記した時 (24時間表記)。00, 01, …, 23
%I0埋めした10進数で表記した時 (12時間表記)。01, 02, …, 12
%pロケールの AM もしくは PM と等価な文字列になります。AM, PM (en_US);am, pm (de_DE)
%M0埋めした10進数で表記した分。00, 01, …, 59
%S0埋めした10進数で表記した秒。00, 01, …, 59
%f10進数で表記したマイクロ秒 (左側から0埋めされます)。000000, 000001, …, 999999
%zUTCオフセットを ±HHMM[SS[.ffffff]] の形式で表示します (オブジェクトがnaiveであれば空文字列)。(空文字列), +0000, -0400, +1030, +063415, -030712.345216
%Zタイムゾーンの名前を表示します (オブジェクトがnaiveであれば空文字列)。(空文字列), UTC, GMT
%j0埋めした10進数で表記した年中の日にち。001, 002, …, 366
%U0埋めした10進数で表記した年中の週番号 (週の始まりは日曜日とする)。新年の最初の日曜日に先立つ日は 0週に属するとします。00, 01, …, 53
%W0埋めした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は他でも今後使いそうなので、どこかのタイミングでもう少し学んでみようと思います。

参考

  1. datetime の UTC / JSTの変換についてまとめ
  2. datetime
  3. dateutil

タイトルとURLをコピーしました