☆☆ 新着記事 ☆☆

2019年5月19日日曜日

PythonのDateTime.Object(UTC) のタイムゾーン変更

Python の DateTime Objectは、timedelitaを使って簡単に必要な変更ができる。

タイムゾーンの情報を持った日付情報を 'aware' と言い、そうでないものを'naive' という。

classmethod datetime.now(tz=None)

(使い方)
import datetime

now = datetime.datetime.now(tz=None)
print(now) #2019-05-25 20:55:32.227350


◇基本の修正
import datetime

now = datetime.datetime.now()
est_time = tweet.created_at + datetime.timedelta(hours = -5)

hoursは、修正する対象の単位で、他にも、weeks, days, minutes,secondsが利用できる。
複数の単位を指定する場合は以下のようにする。
datetime.timedelta(days=7, hours=1, seconds=10)


詳細:簡単にできる単位別の+、-、
https://qiita.com/7110/items/4ece0ce9be0ce910ee90

◇Daylight Saving Time の考慮

いわゆる夏時間というもので、
ESTだと、 UTCの  - 5 hours
EDTだと、UTCの  - 4 hours
時間となり、1年のうちに時間差が変更になる。

それでも、EST/EDTの変更日が決まっていれば、計算できそうだけど、

アメリカのDaylight Saving Time (DST)は、

In the U.S., daylight saving time starts on the second Sunday in March and ends on the first Sunday in November, with the time changes taking place at 2:00 a.m. local time

となっていて、毎年、適用開始/終了日が異なる。

なので自分でCodeするのは諦めて、Python の3rd Partyの Libraryを使った方が良い。

import pytz
from datetime import datetime


et = pytz.timezone('US/Eastern')
utc= pytz.utc
fmt = "%Y-%m-%d %H:%M:%S %Z%z"
fmt2= "%Y-%m-%d %H:%M:%S "


for tweet in tweets:
    print("Original Created_at")
    print(tweet.created_at)
    est_time = tweet.created_at.astimezone(et)
    print("Converted Time")
    print(est_time)
   
    est_localize = est_time.strftime(fmt)
    print("with fmt")
    print(est_localize)


    est_localize2 = est_time.strftime(fmt2)
    print("with fmt2")
    print(est_localize2)


#Output
Original Created_at
2019-05-19 12:49:33
Converted Time
2019-05-18 23:49:33-04:00
with fmt
2019-05-18 23:49:33 EDT-0400
with fmt2
2019-05-18 23:49:33



How to convert UTC to EST with Python and take care of daylight saving automatically?


https://stackoverflow.com/questions/48416511/how-to-convert-utc-to-est-with-python-and-take-care-of-daylight-saving-automatic/48417012#48417012

◇tweepyで取得するcreated.atについて

Thu Apr 23 13:38:19 +0000 2019
の書式で取得できるので、もう少し工夫が必要


以下が完成版。

#Twitter の created_at は、 utcで記録されていますが、datetime objには、timezone情報を持っていません。 そこで、utc であることをtimezone情報にもたせてから、Estern timeに変換します。
(Datetime objがタイムゾーン情報をもっているか(awareであるか)の調べ方は次の投稿 -実践編で)

import datetime
from datetime import datetime,date
import pytz

tweets = extractor.user_timeline(screen_name="realDonaldTrump", count=3,include_rts=True,tweet_mode="extended")

et = pytz.timezone('US/Eastern')
utc = pytz.utc
fmt = "%Y-%m-%d %H:%M:%S"

for tweet in tweets:

    reformatted_created_at =tweet.created_at.strftime('%Y-%m-%d %H:%M:%S')
    reformatted_created_at2 = datetime.strptime(reformatted_created_at,"%Y-%m-%d %H:%M:%S").replace(tzinfo=pytz.UTC)

    est_time = reformatted_created_at2.astimezone(et)

    print(est_time)

となる。

以下は、この結論になるまでのテスト。

********************************************************

1. Basic datetime
import datetime

now = datetime.datetime.now(tz=datetime.timezone.utc)
print(now)
Outoput:
2019-05-20 00:26:15.510768+00:00
*naive vs aware time zone info
now = datetime.datetime.now() #naive : 2019-05-20 00:40:37.940085  

2.Utilize pytz
import datetime
import pytz

now = datetime.datetime.now(tz=datetime.timezone.utc)
print(now) #2019-05-20 00:45:02.737131+00:00
jst = pytz.timezone('Asia/Tokyo')
jst_now = datetime.datetime.now(tz=jst)
print(jst_now) #2019-05-20 09:45:02.739732+09:00 
et = pytz.timezone('US/Eastern')
fmt = "%Y-%m-%d %H:%M:%S"
est_time = now.astimezone(et)
jst_to_et =jst_now.astimezone(et)
print(est_time) #2019-05-19 20:45:02.737131-04:00 
print(jst_to_et)#2019-05-19 20:45:02.737131-04:00 

★created_at : format
Basic format:Thu Apr 23 13:38:19 +0000 200
import datetime
from datetime import datetime,date
import pytz
created_at="Thu Apr 23 13:38:19 +0000 2009"
modified =datetime.strptime(created_at,'%a %b %d %H:%M:%S +0000 %Y').replace(tzinfo=pytz.UTC)
print(modified)
#output: 2009-04-23 13:38:19+00:00 
*daytime.strptimeは、
from datetime import datetime,date is imperative to use.

(Sample Tested)
import datetime
from datetime import datetime,date
import pytz
created_at="Thu Apr 23 13:38:19 +0000 2009"
print(created_at)
reformatted_created_at =datetime.strptime(created_at,'%a %b %d %H:%M:%S +0000 %Y').replace(tzinfo=pytz.UTC)
print('reformatted')
print(reformatted_created_at)
et = pytz.timezone('US/Eastern')
fmt = "%Y-%m-%d %H:%M:%S"
est_time = reformatted_created_at.astimezone(et)
est_time_fmt=est_time.strftime(fmt)
print(est_time)
print(est_time_fmt)
output:
Thu Apr 23 13:38:19 +0000 2009                                                 
reformatted                                                                    
2009-04-23 13:38:19+00:00                                                      
2009-04-23 09:38:19-04:00                                                      
2009-04-23 09:38:19


① Trumpのツイート(13:25 - 2019年5月19日)を、②LouDobbs氏がQuoteしてツイートし、、③それを再度、Trump氏がリツイート。
この場合、最初の'created_at'に記載されているのが、Trump氏の最後のリツイート時間③。
但し、Twitterページで確認できる時間は、②のQuoteツイートした時間。
且つ、Twitterページで確認できるのは、Tweetした人 'LouDobbs氏' のローカル・タイム(ET)。
又、<blockquote class="twitter-tweet">でWeb表示した場合、'LouDobbs氏' のツイートの時間を、
Web閲覧者の時間に変更して表示(JST)
従って、いずれのWebで表示できる時間とは異なるものの、Trump氏がいつツイートをしたかを
知りたいのであれば、最初のcreated_atを参照することが正しい。
Tweet Objectに含まれる3種類のcreated_at:
 _json={
'created_at': 'Mon May 20 02:47:21 +0000 2019', ・・・③
'retweeted_status': {
'created_at': 'Sun May 19 23:34:46 +0000 2019',  ・・・②
'quoted_status': 'created_at': 'Sun May 19 20:25:34 +0000 2019・・・①でもないよう。

1) <blockquote class="twitter-tweet">でのPC上のWebに表示される時間:
8:34 - 2019年5月20日 (utc +9:00時間)
2) TwitterのPCページで表示される時間
16:34 - 2019年5月19日 (utc -4:00時間)- Trumpのリツイート時間ではない。

◇①のツイートの時間
1)Mobile APP;
5:25am 20 May 19

0 件のコメント:

コメントを投稿