尝试将datetime.datetime格式2016-09-01 00:00:00到datetime.datetime格式的列标题转换为“2016-09-01”

时间:2017-01-28 08:52:56

标签: python python-3.x pandas

我使用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 

它也不起作用。我甚至没有收到任何错误。有什么建议吗?

2 个答案:

答案 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转换为stringobject) - 请使用@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