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

时间:2017-01-24 00:51:58

标签: python json datetime pandas twitter

所以我有Twitter数据,我正在尝试计算我在不同日期有多少推文。例如,在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 个答案:

答案 0 :(得分: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)))