将 Twitter 时间转换为特定格式的日期时间,以计算一天的推文频率

Posted

技术标签:

【中文标题】将 Twitter 时间转换为特定格式的日期时间,以计算一天的推文频率【英文标题】:Convert Twitter Time into Datetime in Specific Format to Count Frequency of Tweets on a Day 【发布时间】:2017-06-08 15:59:14 【问题描述】:

所以我有推特数据,我试图计算我在不同日子有多少推文。因此,例如,在 10 条推文的列表中,它们可能是在不同的日子里创建的,所以我只想弄清楚给定日期有多少条推文(在推文集中)。

每个对象都是 JSON 格式,并且可以作为字典键访问字段。在这种情况下,为了弄清楚它是什么时候创建的,我使用下面的“日期”字段:

'location': [Decimal('-118.3851587'), Decimal('34.0843881')], 'text': "random sample text", 'user': 'random user i cant show', 'id': Decimal('NaN'), 'date': 'Thu Oct 20 02:40:55 +0000 2016']

即日期在原始数据中的格式如下:

Thu Oct 20 02:40:55 +0000 2016

我需要把它变成这种格式:

2016-10-20

我打算制作一个 pandas 数据框,它会在遇到一个日期时为每个日期创建一个新行,但我担心每次都必须经过并动态添加行会很昂贵。

由于我知道推文所处的具体日期范围,因此我将创建一个数据框,其中包含包含这些日期的预定行。

为此,我使用了以下代码:

from datetime import date, timedelta as td 
d1 = date(2016, 9, 17)
d2 = date(2016, 11, 7)

delta = d2-d1
listOfDates = []
for i in range(delta.days+1):
    print(d1 + td(days=i))
    listOfDates.append(d1 + td(days=i))

这将输出以下日期:

2016-09-17
2016-09-18
2016-09-19
2016-09-20
2016-09-21
...
2016-11-04
2016-11-05
2016-11-06
2016-11-07

这创建了一个从开始到结束的日期列表,我用它创建了一个数据框(使用 DataFrame.set_index,其中日期列表中的值成为行值)。

但是现在当我浏览我的推特数据时,我需要动态检查日期字段中的日期,其格式与列中的相同(即原始的 2016 年 10 月 20 日)上面的数据示例)。对于如何将其即时格式化为上述特定格式,我有点迷茫。

编辑

新问题(稍微不相关但仍然相关)。

所以在我的代码中,我有一个日期列表,但这些都是日期时间对象(即它们是在我的帖子中的代码块中生成并存储在“listOfDates”中的)。

我有一个数据框,其中行是日期,所以我使用了 df.set_index(listOfDates) 但它显示错误:“KeyError: datetime.date(2016, 9, 17)”。

如何使列表以正确的格式显示对象,而不是显示 datetime.date?可能是个愚蠢的问题...

好吧,实际上,我使用 strftime 将其转换为正确的格式,但它仍然显示 KeyError: '2016-09-17'

NVM 我很笨。是 df.index 而不是 df.set_index

【问题讨论】:

【参考方案1】:

首先制作一些用于格式化单个字符串的 lambda 函数。

from datetime import datetime
import re

unformatted = "Thu Oct 20 02:40:55 +0000 2016"

# Use re to get rid of the milliseconds.
remove_ms = lambda x:re.sub("\+\d+\s","",x)

# Make the string into a datetime object.
mk_dt = lambda x:datetime.strptime(remove_ms(x), "%a %b %d %H:%M:%S %Y")

# Format your datetime object.
my_form = lambda x:":%Y-%m-%d".format(mk_dt(x))

my_form(unformatted)
>>>'2016-10-20'

现在您可以假设您的 Pandas DataFrame 具有相同格式的字符串列,您可以将新函数应用于该列中的所有元素,如下所示:

my_df.dates_column.apply(my_form)

或者您可以创建一个 lambda 函数来转换每个项目,并将其附加到 for 循环中的列表中

from datetime import date, timedelta as td

# Make a lambda function to directly format your datetime objects.
dt_form = lambda x:":%Y-%m-%d".format(x)

d1 = date(2016, 9, 17)
d2 = date(2016, 11, 7)

delta = d2-d1
listOfDates = []
for i in range(delta.days+1):
#     print(d1 + td(days=i))
    listOfDates.append(dt_form(d1 + td(days=i)))

【讨论】:

哦,你是救生员。我不知道如何使用 re 来做到这一点,但我想我现在明白了。谢谢 =)。 没有问题。如果你打算做更多的 python,re 模块很棒,我强烈建议你研究它。它可以为您节省大量时间。这是一个非常好的regex cheatsheet。你也介意赞成这个答案。我需要积分 ;) 还有一个问题。所以在我的代码中,我有一个日期列表,但这些都是日期时间对象(即它们是在我的帖子中的代码块中生成的,并存储在“listOfDates”中)。我有一个数据框,其中行是日期,所以我使用了 df.set_index(listOfDates) 但它显示错误:“KeyError: datetime.date(2016, 9, 17)”。如何使列表以正确的格式显示对象,而不是说 datetime.ate 大声笑。可能是个愚蠢的问题... 嗯,实际上,我使用 strftime 将其转换为正确的格式,但它仍然显示 KeyError: '2016-09-17' 如果没有给你错误的DataFrame,调试它有点困难。您能否编辑您的问题以包含我们正在查看的 df 类型的一个小示例?

以上是关于将 Twitter 时间转换为特定格式的日期时间,以计算一天的推文频率的主要内容,如果未能解决你的问题,请参考以下文章

将字符串转换为 Excel 日期和时间,具有特定的字符串格式

将Dataset中的列类型转换为python中具有特定格式的日期时间类型时出错

在linux中将特定日期格式转换为Epoch

在R中将日期转换为特定格式的字符

特定 ISO 格式的 Pandas 日期时间转换

无法将特定的日期时间字符串转换为日期