'Series' 对象没有 'datetime' 属性。

4

我正在尝试将 Pandas 数据框中的时间戳列(YYYY-MM-DD HH-MM-SS)转换为秒。

这是我的当前代码:

df['recorded_time'] = pd.to_datetime(df['recorded_time'])
df['timestamp'] = df['recorded_time'].datetime.total_seconds() #creating a new column

我一直遇到的错误是:
AttributeError: 'Series' object has no attribute 'datetime'

有人能指出我可能漏掉了哪一步吗?


1
因为它不会。to_datetime将返回一个datetime64值,它没有与常规Python datetime相同的方法/属性。您需要使用.dt访问器,例如df['timestamp'] = df['recorded_time'].dt.但是total_seconds()是Python中的datetime.timedelta方法,所以即使我们将其翻译成pandas,我也不知道您希望它做什么。从何时开始算秒数? - roganjosh
@roganjosh 2019/01/01 00:00:00 可行...... 我试图遵循这个链接的指导:https://stackoverflow.com/questions/56430069/spatial-temporal-interpolation-in-python 不过,我仍然会得到相同的属性错误。 - fullstacked
Roganjosh的意思是,total seconds是一个timedelta,这意味着它需要两个时间点之间的总秒数。在这种情况下,您只有一个时间戳(一个时间点)。因此,获取“总秒数”没有意义。从何时或什么时候开始算起的总秒数? - Erfan
2个回答

8
我正在使用您在评论中提供的示例来处理df。在pandas datetime64值上,不能使用常规datetime.datetime方法,除非使用.dt访问器。除了您链接的示例之外,您还希望total_seconds参考基本日期时间为2019/01/01 00:00:00。否则,timedelta必须始终具有某种参考点,否则它可能是任意值。请注意保留HTML标记。
import pandas as pd

df1 = pd.DataFrame({'lat':[15.13,12.14,13.215,11.1214,12.14], 
              'lon': [38.52, 37.536,39.86,38.536,37.536],
              'Datetime': pd.to_datetime(['2019-03-09 16:05:07',
                                          '2019-03-15 09:50:07',
                                          '2019-03-09 11:03:47',
                                          '2019-03-10 16:41:18',
                                          '2019-03-09 06:15:27']),
              'temp':[23,22,21,22,19]})

# We can just call it once to get a reference to your datum point
base_dt = pd.to_datetime('2019/01/01 00:00:00')

df1['seconds'] = (df1['Datetime'] - base_dt).dt.total_seconds()

0

将日期时间转换为数字的一种方法是将其视为'int64'

df['ns_since_UNIX_epoch'] = df['recorded_time'].view('int64')

# this is equivalent to 
(df['recorded_time'] - pd.Timestamp('1970-01-01')).dt.total_seconds() * 10**9

一般来说,要访问日期时间方法,请在 Pandas 列上使用 .dt 访问器;要访问字符串方法,请使用 .str 访问器。
要查看 Pandas 列或 Series 的所有属性列表,请调用 dir()。您可以检查以下内容:
'datetime' in dir(pd.Series)          # False
'dt' in dir(pd.Series)                # True
'total_seconds' in dir(pd.Series.dt)  # True

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接