Python Pandas 更新数据框列类型

3

我正在使用pandas将一个excel读入,除了第一列,所有的列标题都是日期时间格式。我想要格式化这些日期时间列标题。

以下是测试数据和代码。

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]

我希望将日期时间标题格式化为仅日期。例如:将2018-01-31 08:00:00更新为2018-01-31
我使用.date()函数来实现这一目标,但我认为我的方法是错误的。以下行不会更新日期时间列标题。
df.loc[:, df.columns != 'ID'].columns = [x.date() for x in df.loc[:, df.columns != 'ID'].columns]

有什么想法或指针? 在此输入图片描述

谢谢。

3个回答

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
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

1
自从pandas的版本0.15.0起,你可以使用.dt访问器来获取日期(忽略时间),这将返回datetime.date dtype
df['dates_without_time'] = df['datetime'].dt.date

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接