我目前有一个通过抓取谷歌新闻标题创建的数据框。我的一个专栏是" Time",它指的是文章发表的时间。
不幸的是,对于最近的文章,谷歌新闻使用了一个"亲戚"日期,例如,6小时前或1天前而不是2017年11月1日。
我真的想将这些相对日期转换为与其他条目一致(例如,他们也说明了2017年11月12日),但我不知道从哪里开始。
我的想法是制作一个代表今天日期的变量,然后在数据框中搜索与我的格式不匹配的东西,然后用当前日期减去那些相对时间。我还必须为那些已经过了34个小时前的东西做过某种过滤器"并且只有那些等于当前日期。
我不是真的想要一个解决方案,而是一个大致的想法,想要尝试解决这个问题。我应该尝试使用numpy吗?
某些行的示例:
Publication Time Headline
0 The San Diego Union-Tribune 6 hours ago I am not opposed to new therapeutic modalities...
1 Devon Live 13 hours ago If you're looking for a bargain this Christmas...
15 ABS-CBN News 1 day ago Now, Thirdy has a chance to do something that ...
26 New York Times Nov 2, 2017 Shepherds lead their sheep through the centre ...
答案 0 :(得分:3)
您可以先将to_datetime
与to_timedelta
一起使用,然后将combine_first
与floor
一起使用:
#create dates
dates = pd.to_datetime(df['Time'], errors='coerce')
#create times
times = pd.to_timedelta(df['Time'].str.extract('(.*)\s+ago', expand=False))
#combine final datetimes
df['Time'] = (pd.datetime.now() - times).combine_first(dates).dt.floor('D')
print (df)
Publication Time \
0 The San Diego Union-Tribune 2017-11-12
1 Devon Live 2017-11-11
2 ABS-CBN News 2017-11-11
3 New York Times 2017-11-02
Headline
0 I am not opposed to new therapeutic modalities
1 If you're looking for a bargain this Christmas
2 Now, Thirdy has a chance to do something that
3 Shepherds lead their sheep through the centre
print (df['Time'])
0 2017-11-12
1 2017-11-11
2 2017-11-11
3 2017-11-02
Name: Time, dtype: datetime64[ns]
答案 1 :(得分:2)
你的方法应该有效。使用Pandas Timedelta
从当前日期中减去相对日期。
例如,将您的样本数据视为:
Publication;Time;Headline
The San Diego Union-Tribune;6 hours ago;I am not opposed to new therapeutic modalities
Devon Live;13 hours ago;If you're looking for a bargain this Christmas
ABS-CBN News;1 day ago;Now, Thirdy has a chance to do something that
New York Times;Nov 2, 2017;Shepherds lead their sheep through the centre
从剪贴板中读取数据(尽管您可以轻松地用read_csv()
或其他文件格式替换):
import pandas as pd
from datetime import datetime
df = pd.read_clipboard(sep=";")
对于已经采用日期格式的日期,Pandas足够聪明,可以使用to_datetime()
转换它们:
absolute_date = pd.to_datetime(df.Time, errors="coerce")
absolute_date
0 NaT
1 NaT
2 NaT
3 2017-11-02
Name: Time, dtype: datetime64[ns]
对于相对日期,一旦我们删除“之前”部分,它们基本上采用正确的格式转换为pd.Timedelta
:
relative_date = (datetime.today() -
df.Time.str.extract("(.*) ago", expand=False).apply(pd.Timedelta))
relative_date
0 2017-11-11 17:05:54.143548
1 2017-11-11 10:05:54.143548
2 2017-11-10 23:05:54.143548
3 NaT
Name: Time, dtype: datetime64[ns]
现在通过Jezrael的回答填写每个集合中的NaN
值,绝对值和相对值(更新为使用combine_first()
):
date = relative_date.combine_first(absolute_date)
relative_date
0 2017-11-11 17:06:29.658925
1 2017-11-11 10:06:29.658925
2 2017-11-10 23:06:29.658925
3 2017-11-02 00:00:00.000000
Name: Time, dtype: datetime64[ns]
最后,只提取日期时间的日期:
date.dt.date
0 2017-11-11
1 2017-11-11
2 2017-11-10
3 2017-11-02
Name: Time, dtype: object