【问题标题】:How to extract time stamp in a column using Python Pandas如何使用 Python Pandas 在列中提取时间戳
【发布时间】:2017-10-10 18:14:03
【问题描述】:

我的数据集(Excel)只有一列,但信息太多。我想根据时间戳将其转换为表格格式。我想将其转换为如下列:时间、名称、URL。我正在尝试使用 Python Pandas 来实现这一点。

我正在查看这样的数据集:

6/10/2017  8:40:34 AM

James

URL:.....(multiple rows)

6/10/2017 8:45:34 AM

Jenny

URL:....

如何使用 Python Pandas 做到这一点?

【问题讨论】:

  • 你是说有多个值为URL的行还是有多个TimeNameURL的三元组?
  • 我们是否可以假设数据集中的行可以按照日期时间、名称、网址(1 个或多个)等顺序进行分组?
  • url 中的多行意味着我无法根据它们的位置提取数据。所以我想先获取时间戳,然后使用时间戳位置来获取其他变量,例如名称和 URL。
  • 嗨本·沃特,你的理解是对的..

标签: python pandas


【解决方案1】:

这里有一个可以提供帮助的方法。

#create the dataframe
df = pd.DataFrame({'time': ['6/10/2017 08:40:34 AM', '6/10/2017 08:45:34 AM'], 'name':['James', 'Jenny'], 'url':['www.yahoo.com', 'www.google.com']})

# Set the index of the dataframe to time
indexed_df = df.set_index('time')

# review the original dataframe
df
Out[11]: 
    name                   time             url
0  James  6/10/2017 08:40:34 AM   www.yahoo.com
1  Jenny  6/10/2017 08:45:34 AM  www.google.com

# check the newly indexed dataframe
indexed_df
Out[12]: 
                        name             url
time                                        
6/10/2017 08:40:34 AM  James   www.yahoo.com
6/10/2017 08:45:34 AM  Jenny  www.google.com

我希望这会有所帮助。这是取自此文档https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.set_index.html

【讨论】:

  • 问题是我的数据集不只是两条记录,还有一百个......
【解决方案2】:

一种方法是使用 reshape,前提是值的顺序准确

df = pd.DataFrame(np.reshape(df.values,(len(df)//3,3)))
df.columns = ['Time', 'Name', 'URL']

    Time                    Name    URL
0   6/10/2017 8:40:34 AM    James   URL:.....(multi rows)
1   6/10/2017 8:45:34 AM    Jenny   URL:....

编辑:这是另一种方法

  1. 使用 pd.to_datetime 提取时间
  2. 使用 str.contains(URL) 提取 URL
  3. 其他一切都归 Name
  4. 每三行分组以填充 NaN 并删除重复项。

    df['Time'] = pd.to_datetime(df['col'], errors = 'coerce')

    df.loc[df['col'].str.contains('URL'), 'URL'] = df['col']

    df['Name'] = df[(df['Time'].isnull() & df['URL'].isnull())].col

    df.drop('col', axis = 1).groupby(df.index//3).ffill().bfill().drop_duplicates()

你得到

    Time                URL                     Name
0   2017-06-10 08:40:34 URL:.....(multi rows)   James
3   2017-06-10 08:45:34 URL:....                Jenny

【讨论】:

  • 您好,我不能使用位置来索引数据。 ,多行意味着时间并不总是在像 3、6、9 这样的列中......我对如何找到那些时间戳感到困惑......我计划首先找到它们并根据时间数据位置进一步索引...
  • 非常感谢!我正在使用您的方法进行处理。希望我能解决这个问题。
  • 您好,它工作得不是很好...我没有找到处理 NaT 拆分时间列的方法...
  • 如果我无法重现错误,则很难想到除此之外的解决方案:(
猜你喜欢
  • 1970-01-01
  • 2020-06-27
  • 2016-12-01
  • 2020-08-09
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
  • 2021-03-17
相关资源
最近更新 更多