我有一个列表(实际上是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
出了什么问题?
答案 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索引。对象的类确定在这种情况下会发生什么。具体来说,a
是pandas.Series
,它会转换对象以符合其dtype
。