Python:将datetime转换为序数

时间:2018-04-13 09:14:29

标签: python pandas datetime dataframe

我有一个列表(实际上是pandas DataFrame中的一个列,如果这很重要)的Timestamps,我试图将列表的每个元素转换为序数格式。所以我在列表中运行for循环(有更快的方法吗?)并使用:

import datetime as dt
a = a.toordinal()

import datetime as dt
a = dt.datetime.toordinal(a)
然而,为了简单起见,发生了以下情况:

In[1]: a
Out[1]: Timestamp('2019-12-25 00:00:00')
In[2]: b = dt.datetime.toordinal(a)
In[3]:b
Out[3]: 737418
In[4]:a = b
In[5]:a
Out[5]: Timestamp('1970-01-01 00:00:00.000737418')

结果对我来说绝对没有意义。显然我尝试得到的是:

In[1]: a
Out[1]: Timestamp('2019-12-25 00:00:00')
In[2]: b = dt.datetime.toordinal(a)
In[3]:b
Out[3]: 737418
In[4]:a = b
In[5]:a
Out[5]: 737418

出了什么问题?

console output screenshot

2 个答案:

答案 0 :(得分:0)

请不要循环播放。没有必要。

#!/usr/bin/env python

import pandas as pd
from datetime import datetime

df = pd.DataFrame({'dates': [datetime(1990, 4, 28),
                             datetime(2018, 4, 13),
                             datetime(2017, 11, 4)]})

print(df)
print(df['dates'].dt.weekday_name)
print(df['dates'].dt.weekday)
print(df['dates'].dt.month)
print(df['dates'].dt.year)

给出数据框:

       dates
0 1990-04-28
1 2018-04-13
2 2017-11-04

印刷值

0    Saturday
1      Friday
2    Saturday
Name: dates, dtype: object

0    5
1    4
2    5
Name: dates, dtype: int64

0     4
1     4
2    11
Name: dates, dtype: int64

0    1990
1    2018
2    2017
Name: dates, dtype: int64

对于toordinal,你需要"循环"申请:

print(df['dates'].apply(lambda x: x.toordinal()))

给出以下pandas系列

0    726585
1    736797
2    736637
Name: dates, dtype: int64

答案 1 :(得分:0)

  

出了什么问题?

您的问题有点误导,屏幕截图显示正在发生的事情。

通常,当你写

a = b
在Python中,它将名称a绑定到绑定到b的对象。在这种情况下,您将拥有

id(a) == id(b)

但是,在您的情况下,与您的问题相反,您实际上正在进行作业

a[0] = b

这将调用a方法,将b分配给其0索引。对象的类确定在这种情况下会发生什么。具体来说,apandas.Series,它会转换对象以符合其dtype