将 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 日期和时间,具有特定的字符串格式