我使用pandas从excel文件导入数据并清理它。但我现在面临的问题是我的所有专栏都有datetimeformat中的标题,就像这样,'2016-09-01 00:00:00',但我只需要这种格式'2016-09-01' 。这些是我正在使用的代码:
import pandas
df7 = pandas.read_excel("abc.XLSX", sheetname = 0, header = 0, index_col=[0], skiprows= [0,1])
names = df7.columns.tolist()
因此,名称包含我的所有列标题作为列表。 当我一次拿一个列并使用一个函数:strftime时,它就可以了。
names[1].strftime('%Y-%m-%d')
我得到了我想要的格式。但我想运行一个循环,以便所有31列cab可以在一个代码中完成。由于第一列标题是字符串变量“time”,因此在使用循环时我将离开第0列。我使用以下代码:
for i in names[1:33]:
i.strftime('%Y-%m-%d')
print (i)
但实际上没有发生任何事情,格式仍然相同。 我也尝试了另一种方式,但它也没有用:
for i in names:
if i is type(datetime.datetime):
i.strftime('%Y-%M-%d')
else:
pass
它也不起作用。我甚至没有收到任何错误。有什么建议吗?
答案 0 :(得分:3)
请注意,strftime
本身不起作用pod install
。因此,当您inplace
输出时,您可能应该i=i.strftime('%Y-%m-%d')
看到任何效果。
这是完成相同过程的有效方法:
1)如果您提到的所有列都属于print
类型,则可以使用datetime64[ns]
并记住将这些更改分配回strftime
属性:< / p>
.columns
此外,可以使用.date
属性,它只会丢弃它的日期部分并丢弃时间。
df.columns = df.columns.strftime("%Y-%m-%d")
2)如果出现混合df.columns = df.columns.date
(dtypes的组合),您可以借助map
方法上的自定义函数在其类型上过滤这些列:
dtypes
答案 1 :(得分:2)
如果您想将列dtype转换为string
(object
) - 请使用@Nickil's solution。
如果您希望保留datetime64
dtype中的列并删除时间,可以使用normalize()方法:
In [79]: df
Out[79]:
2017-01-01 08:00:00 2017-01-02 09:00:00
0 1 2
1 3 4
In [80]: df.columns.dtype
Out[80]: dtype('<M8[ns]')
In [81]: df.columns.normalize()
Out[81]: DatetimeIndex(['2017-01-01', '2017-01-02'], dtype='datetime64[ns]', freq=None)
In [82]: df.columns = df.columns.normalize()
In [83]: df
Out[83]:
2017-01-01 2017-01-02
0 1 2
1 3 4
In [84]: df.columns.dtype
Out[84]: dtype('<M8[ns]')
更新:.normalize()
方法剥离时间部分的小型演示:
In [91]: x = pd.DataFrame({'ts':pd.date_range('2017-01-01', freq='999999S', periods=5)})
In [92]: x
Out[92]:
ts
0 2017-01-01 00:00:00
1 2017-01-12 13:46:39
2 2017-01-24 03:33:18
3 2017-02-04 17:19:57
4 2017-02-16 07:06:36
In [93]: x.ts.dt.normalize()
Out[93]:
0 2017-01-01
1 2017-01-12
2 2017-01-24
3 2017-02-04
4 2017-02-16
Name: ts, dtype: datetime64[ns]
<强>设定:强>
"2017-01-01 08:00:00" "2017-01-02 09:00:00"
1 2
3 4
df = pd.read_clipboard()
df.columns = pd.to_datetime(df.columns)
In [114]: df.columns.dtype
Out[114]: dtype('<M8[ns]')
In [115]: df
Out[115]:
2017-01-01 08:00:00 2017-01-02 09:00:00
0 1 2
1 3 4
In [116]: df.columns = df.columns.normalize()
In [117]: df
Out[117]:
2017-01-01 2017-01-02
0 1 2
1 3 4