从Twitter日期转换为Python datetime日期

58

我从 Twitter 收到的消息是以特定日期的形式发送的,格式如下:

Tue Mar 29 08:11:25 +0000 2011

我想将这些日期存储在postgresql中的'timestamp with time zone'字段中,并使用Django的DateTimeField字段。但是,当我存储该字符串时,我会收到此错误:

ValidationError: [u'Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format.']

我能否自动将Twitter日期类型转换为Python datetime时间(该时间在我的应用程序的其他地方有效用于保存日期)。

10个回答

98

写下如下代码可将 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'))

更新

针对Python 3,截至2020年,您可以使用以下方式进行操作:

from datetime import datetime

# dtime = tweet['created_at']
dtime = 'Fri Oct 09 10:01:41 +0000 2015'
new_datetime = datetime.strftime(datetime.strptime(dtime,'%a %b %d %H:%M:%S +0000 %Y'), '%Y-%m-%d %H:%M:%S')
print((new_datetime))

1
这给了我以下错误,'期望字符串或缓冲区'。你能帮我解决一下吗? - Zaira Zafar
@ZairaZafar 我在下面添加了一个答案,可能会有所帮助。我曾经遇到过跟你类似的错误。 - Bob Aleena

15

尝试这个方法。假设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])

我更喜欢这种方法,因为它甚至可以处理与+0000不同的时区(尽管Twitter始终使用+0000)。Django方面也最好使用utc时区使得结果datetime具有时区感知能力(参见此问题)。 - caipirginka

8

虽然有点旧,但使用parse确实帮助我解决了这个问题。

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

1
这似乎是2019年最好的答案。这种方法有什么缺点吗? - Robert Lugg
1
不,这仍然是2021年最Pythonic的方法。使用通用解析器。 - Marc Maxmeister

3
为了获得带时区的日期时间,您可以使用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

3

Twitter API V2 发送的日期字符串格式如下:

2020-12-15T20:17:10.000Z

以下代码可将字符串转换为日期时间:

datetime.datetime.strptime(THE_STRING,"%Y-%m-%dT%H:%M:%S.%fZ")

结尾看起来像是时区,但它表示的是毫秒,因此使用了 %f 。最后一个字符 "Z" 是代表 UTC 的时区代码,详见这里


2

你可以使用datetime.strptime()time.strptime()来转换日期。然而,这两个函数无法解析时区偏移(请参见此错误)。

因此,我唯一看到的解决方案是自己拆分日期,删除时区偏移量,将其余部分传递给strptime(),并手动处理偏移量...

请查看此问题,在其中您会找到有关如何自行解析偏移量的一些提示。


1
我遇到的最初问题是将Twitter API提供的日期时间转换为字符串。
以下内容适用于解决人们对上述解决方案的不同评论,这些评论可能有点不清楚起始日期是否已经以字符串格式存在。这适用于Python 2.7。
使用API中的推文,tweet.created_at以datetime格式给出日期。在文件顶部添加from datetime import datetime
然后使用以下内容获取相应的字符串。
datetime.strftime(tweet.created_at,'%a %b %d %H:%M:%S %z %Y').

你可以按照其他评论中的描述,使用这个字符串来进行操作。

1
下面的代码将从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'))

0
这个怎么样?它不需要任何格式化字符串。
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

使用与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')

1
嘿,这给了我以下错误:strptime()的第一个参数必须是字符串,而不是Series。 - Zaira Zafar
@ZairaZafar,你使用哪个版本的Python?在Python 3.x中,它对我来说很好用。 - 1man
1
我正在使用Python 2.7。 - Zaira Zafar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接