Python Pandas更新Dataframe列类型

时间:2018-04-06 16:15:58

标签: python pandas dataframe

我正在读一个excel到pandas,所有列标题都是datetime,除了第一个。我想格式化datetime列标题。

这是测试数据和代码。

import pandas as pd
import datetime

d = {
         datetime.datetime(2018, 01, 31, 8, 00): [9.1, 8.5, 7.4, 6.5, 5.3],
         datetime.datetime(2018, 02, 28, 9, 00): [9.2, 8.5, 7.2, 6.1, 5.2],
         datetime.datetime(2018, 03, 31, 10, 00): [9.3, 8.5, 7.1, 6.1, 5.1],
         'ID': [1, 2, 3, 4, 5],
    }
df = pd.DataFrame(d, columns= ['ID', datetime.datetime(2018, 01, 31, 8, 00), datetime.datetime(2018, 02, 28, 9, 00), datetime.datetime(2018, 03, 31, 10, 00)])
df.loc[:, df.columns != 'ID'].columns = [x.date() for x in df.loc[:, df.columns != 'ID'].columns]

我想将datetime标头格式化为日期。例如:将2018-01-31 08:00:00更新为2018-01-31

我使用.date()函数来实现这一目标。我认为我的做法是错误的。 下面的行不会更新datetime列标题。

df.loc[:, df.columns != 'ID'].columns = [x.date() for x in df.loc[:, df.columns != 'ID'].columns]

任何想法或指针? enter image description here

感谢。

3 个答案:

答案 0 :(得分:1)

import pandas as pd
import datetime

d = {
         datetime.datetime(2018, 01, 31, 8, 00): [9.1, 8.5, 7.4, 6.5, 5.3],
         datetime.datetime(2018, 02, 28, 9, 00): [9.2, 8.5, 7.2, 6.1, 5.2],
         datetime.datetime(2018, 03, 31, 10, 00): [9.3, 8.5, 7.1, 6.1, 5.1],
         'ID': [1, 2, 3, 4, 5],
    }
df = pd.DataFrame(d, columns= ['ID', datetime.datetime(2018, 01, 31, 8, 00), datetime.datetime(2018, 02, 28, 9, 00), datetime.datetime(2018, 03, 31, 10, 00)])
df.columns = [x.date() if isinstance(x, datetime.datetime) else x for x in df.columns]
print(df.columns)

<强>输出:

   ID  2018-01-31  2018-02-28  2018-03-31
0   1         9.1         9.2         9.3
1   2         8.5         8.5         8.5
2   3         7.4         7.2         7.1
3   4         6.5         6.1         6.1
4   5         5.3         5.2         5.1

答案 1 :(得分:1)

import pandas as pd
import datetime

d = {
         datetime.datetime(2018, 01, 31, 8, 00): [9.1, 8.5, 7.4, 6.5, 5.3],
         datetime.datetime(2018, 02, 28, 9, 00): [9.2, 8.5, 7.2, 6.1, 5.2],
         datetime.datetime(2018, 03, 31, 10, 00): [9.3, 8.5, 7.1, 6.1, 5.1],
         'ID': [1, 2, 3, 4, 5],
    }

df = pd.DataFrame(zip(*d.values()), columns= map(lambda ele: ele if isinstance(ele, str) else ele.date(), d.keys()))
df



2018-01-31  2018-02-28  2018-03-31  ID
0   9.1   9.2   9.3  1
1   8.5   8.5   8.5  2
2   7.4   7.2   7.1  3
3   6.5   6.1   6.1  4
4   5.3   5.2   5.1  5

答案 2 :(得分:1)

从版本0.15.0的pandas开始,您可以使用.dt访问者来获取将返回datetime.date dtype

的日期(并忽略时间)
df['dates_without_time'] = df['datetime'].dt.date