Twitterから特定の日付に次の形式で送信されるTwitterメッセージを受信しています。
Tue Mar 29 08:11:25 +0000 2011
これらの日付を、djangos DateTimeFieldフィールドを使用してpostgresqlの「タイムスタンプとタイムゾーン」フィールドに格納したいと考えています。その文字列を保存すると、次のエラーが発生します。
ValidationError: [u'Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format.']
twitterのdatetypeを自動的にpython datetime timeに変換できますか(これは、アプリ内の他の場所で日付を保存するために機能します)。
このようなものを書くと、Twitterの日付がタイムスタンプに変換されます。
import time
ts = time.strftime('%Y-%m-%d %H:%M:%S', time.strptime(Tweet['created_at'],'%a %b %d %H:%M:%S +0000 %Y'))
これを試してみてください。 Twitterの日付形式がRFC822に準拠していることを前提としています(@Adrienがリンクしている質問を参照してください)。
単純なdatetimeオブジェクトが構築されます(タイムゾーン情報がありません)。 UTCへのタイムゾーンオフセットに従って調整されます。元のタイムゾーンを維持する必要がない限り、日付時刻をUTCとして保存し、表示するときに現地時間にフォーマットします。
from datetime import datetime, timedelta
from email.utils import parsedate_tz
s = 'Tue Mar 29 08:11:25 +0000 2011'
def to_datetime(datestring):
time_Tuple = parsedate_tz(datestring.strip())
dt = datetime(*time_Tuple[:6])
return dt - timedelta(seconds=time_Tuple[-1])
少し古いですが、解析を使用すると、この問題が本当に解決します
from datetime import datetime
from dateutil.parser import parse
date = 'Fri May 10 00:44:04 +0000 2019'
dt = parse(date)
print(dt)
# 2019-05-10 00:44:04+00:00
タイムゾーンで日付時刻を取得するには、次のように単純にdatetime.strptimeを使用します。
from datetime import datetime
s = 'Wed Jun 05 05:34:02 +0000 2019'
created_at = datetime.strptime(s, '%a %b %d %H:%M:%S %z %Y')
print(created_at)
#2019-06-05 05:34:02+00:00
次のコードは、Twitterの日付(UTC)から素敵な日付(現地時間)を出力します。
from datetime import datetime
from datetime import timezone
datetime.strptime(mydata["created_at"], '%a %b %d %H:%M:%S %z %Y').replace(
tzinfo=timezone.utc).astimezone(tz=None).strftime('%Y-%m-%d %H:%M:%S'))
SoFolichonが提案したのと同様の戦略を使用して、Python 3.xでは、次のようにpytz
を使用することもできます。
from datetime import datetime, timezone
import pytz
datetime.strptime(tweets["created_at"], '%a %b %d %H:%M:%S %z %Y').replace(
tzinfo=timezone.utc).astimezone(pytz.timezone('US/Eastern')).strftime(
'%Y-%m-%d %H:%M:%S')
これはどう?フォーマット文字列は必要ありません。
import datetime
from email.utils import mktime_tz, parsedate_tz
def parse_datetime(value):
time_Tuple = parsedate_tz(value)
timestamp = mktime_tz(time_Tuple)
return datetime.datetime.fromtimestamp(timestamp)
print(parse_datetime('Tue Mar 29 08:11:25 +0000 2011'))
#2011-03-29 10:11:25
私のシステムはGMT +2なので、差が含まれています。
私が最初に抱えていた問題は、Twitter APIがStringに与える日時から変換することでした。
開始日がすでに文字列形式であるかどうかについて少し不明確な上記のソリューションに対して人々が持っていると思われるさまざまなコメントに対処する次の作品。これはPython 2.7で機能します
APIからのツイートでは、Tweet.created_atは日付/時刻形式で日付を提供します。ファイルの上部にfrom datetime import datetime
を追加します
次に、以下を使用して対応する文字列を取得します。
datetime.strftime(Tweet.created_at,'%a %b %d %H:%M:%S %z %Y').
その後、他のコメントで説明されているようにこの文字列を使用して操作できます。