【问题标题】:Convert Time Zone + format in Python from Twitter API从 Twitter API 转换 Python 中的时区 + 格式
【发布时间】:2015-03-19 14:58:10
【问题描述】:

在 Python 中,使用 TwitterSearch,我能够以 UTC 时间获取推文的时间戳,格式如下:

Thu Mar 19 12:37:15 +0000 2015

但是,我想在 EST 时区 (UTC - 4) 中自动获取它,格式如下:

2015-03-19 08:37:15

这是我的代码示例。我应该在其中更改什么以进行自动转换?

            for tweet in ts.search_tweets_iterable(tso):
            lat = None
            long = None
            user = tweet['user']['screen_name']
            user_creation = tweet['user']['created_at']
            created_at = tweet['created_at'] # UTC time when Tweet was created.
            favorite = tweet['favorite_count']
            retweet = tweet ['retweet_count']
            id_status = tweet['id']
            in_reply_to = tweet['in_reply_to_screen_name']
            followers = tweet['user']['followers_count'] # nombre d'abonnés
            statuses_count = tweet['user']['statuses_count'] # nombre d'abonnés
            location = tweet['user']['location'] # résidence du twittos
            tweet_text = tweet['text'].strip() # deux lignes enlèvent espaces inutiles
            tweet_text = ''.join(tweet_text.splitlines())
            print i,created_at,user_creation,user, tweet_text
            if tweet['geo'] and tweet['geo']['coordinates'][0]: 
                lat, long = tweet['geo']['coordinates'][:2]
                print u'@%s: %s' % (user, tweet_text), lat, long
            else:
                print u'@%s: %s' % (user, tweet_text)
            print favorite,retweet,id_status,in_reply_to,followers,statuses_count,location

            writer.writerow([user.encode('utf8'), user_creation.encode('utf8'), created_at.encode('utf8'), 
                             tweet_text.encode('utf8'), favorite, retweet, id_status, in_reply_to, followers, statuses_count, location.encode('utf8'), lat, long])
            i += 1
            if i > max:
                return()

提前感谢您!

弗洛伦特

【问题讨论】:

    标签: python twitter timezone


    【解决方案1】:

    如果 EST 是您的本地时区,那么您可以仅使用 stdlib:

    #!/usr/bin/env python
    from datetime import datetime
    from email.utils import parsedate_tz, mktime_tz
    
    timestamp = mktime_tz(parsedate_tz('Thu Mar 19 12:37:15 +0000 2015'))
    s = str(datetime.fromtimestamp(timestamp))
    # -> '2015-03-19 08:37:15'
    

    它也支持非 UTC 输入时区。

    或者您可以明确指定目标时区:

    import pytz # $ pip install pytz
    
    dt = datetime.fromtimestamp(timestamp, pytz.timezone('US/Eastern'))
    s = dt.strftime('%Y-%m-%d %H:%M:%S')
    # -> '2015-03-19 08:37:15'
    

    你可以把它放在一个函数中:

    #!/usr/bin/env python
    from datetime import datetime
    from email.utils import parsedate_tz, mktime_tz
    
    def to_local_time(tweet_time_string):
        """Convert rfc 5322 -like time string into a local time
           string in rfc 3339 -like format.
    
        """
        timestamp = mktime_tz(parsedate_tz(tweet_time_string))
        return datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')
    
    time_string = to_local_time('Thu Mar 19 12:37:15 +0000 2015')
    # use time_string here..
    

    【讨论】:

    • 谢谢!请允许我问一个新手问题:我不确定我应该把 dt = datetime.fromtimestamp(timestamp, pytz.timezone('US/Eastern')) s = dt.strftime('%Y-%m-%d % H:%M:%S') 在我的代码中。
    • @Flo timestamp 的计算方式与答案中的第一个代码示例完全相同。
    • 哦,我明白了。但是我不能通过修改 created_at = tweet['created_at'] 来直接转换我的代码吗?
    • @Flo repr(created_at) 是什么?从一个时区到另一个时区的任何正确转换都将使用 UTC 时间(POSIX 时间戳)——也许是隐式的。您可以将代码放在一个函数中(它接受一种时间格式并以另一种格式和另一个时区返回相同的时间),以创建“直接转换”的错觉。
    • 非常感谢,我已经编写了以下代码,并且它运行良好: user_creation = mktime_tz(parsedate_tz(tweet['user']['created_at'])) timetext_user = str(datetime .fromtimestamp(user_creation)) 时间戳 = mktime_tz(parsedate_tz(tweet['created_at'])) timetext = str(datetime.fromtimestamp(timestamp))
    【解决方案2】:

    从 twitter 发送的日期中删除 +0000 并执行以下操作:

    from datetime import datetime
    import pytz
    
    local = 'Europe/London' #or the local from where twitter date is coming from
    dt = datetime.strptime("Thu Mar 19 12:37:15 2015", "%a %b %d %H:%M:%S %Y")
    dt = pytz.timezone(local).localize(dt)
    est_dt = dt.astimezone(pytz.timezone('EST'))
    
    print est_dt.strftime("%Y-%m-%d %H:%M:%S")
    

    输出:

    2015-03-19 07:37:15
    

    或者,您可以执行以下操作(在这种情况下,您不需要删除 +0000 时区信息):

    from dateutil import parser
    
    dt = parser.parse("Thu Mar 19 12:37:15 +0000 2015")
    est_dt = dt.astimezone(pytz.timezone('EST'))
    
    print est_dt.strftime("%Y-%m-%d %H:%M:%S")
    

    输出

    2015-03-19 07:37:15
    

    顺便问一下,EST 是 UTC-4 还是 UTC-5?

    【讨论】:

    • 如果输入是UTC,那么在这里使用'Europe/London'是错误的(后者有夏令时)。
    • 谢谢!我尝试了另一种解决方案,但这个似乎也很有趣。
    • 注意:%b 取决于区域设置。如果脚本使用非英语语言环境,它可能无法解析时间字符串。
    猜你喜欢
    • 2019-12-25
    • 1970-01-01
    • 2013-06-16
    • 2021-12-21
    • 1970-01-01
    • 2021-06-12
    • 2019-07-06
    • 2011-01-01
    • 1970-01-01
    相关资源
    最近更新 更多