如何将np.datetime64的Pandas数据框列转换为datetime?

hel*_*loB 4 python datetime pandas

我想将Pandas Data Frame列设置为的datetime格式datetime64。这是单独进行的。特别地,以下工作正常:

t = dt['time'].values[0]
datetime.utcfromtimestamp(t.astype(int)/1000000000)
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试对整列进行此操作时

dt['datetime'] = dt['time'].apply(lambda x: datetime.utcfromtimestamp(x.astype(int)/1000000000))
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

pandas.lib.map_infer中的pandas / src / inference.pyx(pandas / lib.c:62578)()

<ipython-input-26-5950d82979b4> in <lambda>(x)
      1 print(type(dt['time'].values[0]))
      2 
----> 3 dt['datetime'] = dt['time'].apply(lambda x: datetime.utcfromtimestamp(x.astype(int)/1000000000))
      4 t = dt['time'].values[0]
      5 print(t)

AttributeError: 'Timestamp' object has no attribute 'astype'
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?如何将列转换为格式datetime和/或以datetime格式创建新列?

这是数据框的信息:

信息

unu*_*tbu 5

您可以通过调用方法将dtype系列转换datetime64[ns]为NumPy datetime.datetime对象数组.dt.to_pydatetime()

In [75]: df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 252 entries, 0 to 251
Data columns (total 1 columns):
time    252 non-null datetime64[ns]<--the `time` column has dtype `datetime64[ns]`
dtypes: datetime64[ns](1)
memory usage: 2.0 KB

In [77]: df.head()
Out[77]: 
        time
0 2009-01-02
1 2009-01-05
2 2009-01-06
3 2009-01-07
4 2009-01-08


In [76]: df['time'].dt.to_pydatetime()[:5]
Out[76]: 
array([datetime.datetime(2009, 1, 2, 0, 0),
       datetime.datetime(2009, 1, 5, 0, 0),
       datetime.datetime(2009, 1, 6, 0, 0),
       datetime.datetime(2009, 1, 7, 0, 0),
       datetime.datetime(2009, 1, 8, 0, 0)], dtype=object)
Run Code Online (Sandbox Code Playgroud)

请注意,NDFrames(例如Series和DataFrames)只能将类似日期时间的对象保存为dtype的对象datetime64[ns]。将所有日期时间喜欢项自动转换为通用dtype可以简化后续日期计算。但这使得无法将Python datetime.datetime对象存储在DataFrame列中。熊猫的核心开发人员Jeff Reback解释说

“我们不允许直接转换,因为它太复杂了,无法在内部保留除datetime64 [ns]以外的任何东西(根本没有必要)。”


piR*_*red 0

没有你的数据集,我不得不猜测一些事情。但是,您应该能够重复与您所证明的工作相同的事情。

dt['datetime'] = datetime.utcfromtimestamp(dt['time'].values.astype(int)/1000000000))
Run Code Online (Sandbox Code Playgroud)