web-dev-qa-db-ja.com

Twitterの日付からPython datetime date

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に変換できますか(これは、アプリ内の他の場所で日付を保存するために機能します)。

43
Javaaaa

このようなものを書くと、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'))
66
Chris Herring

これを試してみてください。 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])
13
Rob Cowie

少し古いですが、解析を使用すると、この問題が本当に解決します

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
4
StriderKeni

タイムゾーンで日付時刻を取得するには、次のように単純に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
2
laynusfloyd

datetime.strptime()またはtime.strptime()を使用して日付を変換できます。ただし、これら2つの関数はタイムゾーンオフセットを解析できません( このバグ を参照)。

だから、私が見る唯一の解決策は、自分で日付を分割し、タイムゾーンのオフセットを削除し、残りをstrptime()にフィードして、オフセットを手動で処理することです...

この質問 を見てください。自分でオフセットを解析する方法についてのヒントがあります。

2
Adrien Plisson

次のコードは、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'))
1
SoFolichon

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')
0
1man

これはどう?フォーマット文字列は必要ありません。

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なので、差が含まれています。

0
MikeCPT

私が最初に抱えていた問題は、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').

その後、他のコメントで説明されているようにこの文字列を使用して操作できます。

0
Bob Aleena