在pandas数据框中将相对时间更改为实际日期

时间:2017-11-12 06:30:18

标签: python pandas datetime dataframe

我目前有一个通过抓取谷歌新闻标题创建的数据框。我的一个专栏是" 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 ...

2 个答案:

答案 0 :(得分:3)

您可以先将to_datetimeto_timedelta一起使用,然后将combine_firstfloor一起使用:

#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