所以我有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答案 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)))