在pandas dataframe

时间:2018-05-15 09:47:29

标签: python python-2.7 pandas datetime dataframe

这是数据帧。我希望这里的日期为'%Y-%m-%d %H:%M:%S'格式。

import pandas as pd
df2 = pd.DataFrame([['2017-18','','','','','','','','','','','',''], ['COMPANIES', '01-APR-2017', '01-MAY-2017', '01-JUN-2017', 
                    '01-JULY-2017', '01-AUG-2017', '01-SEP-2017', '01-OCT-2017', '01-NOV-2017', '01-DEC-2017', '01-JAN-2018', '01-FEB-2018', '01-MAR-2018']])

我试过了,

df2.iloc[1, 1:] = df2.iloc[1, 1:].str.replace("JULY", "JUL")
df2.iloc[1, 1:] = df2.iloc[1, 1:].apply(pd.to_datetime, format = '%d-%b-%Y')

但是,它给出了:

          0                    1                    2                    3   \
0    2017-18                                                                  
1  COMPANIES  1491004800000000000  1493596800000000000  1496275200000000000   

                    4                    5                    6   \
0                                                                  
1  1498867200000000000  1501545600000000000  1504224000000000000   

                    7                    8                    9   \
0                                                                  
1  1506816000000000000  1509494400000000000  1512086400000000000   

                    10                   11                   12  
0                                                                 
1  1514764800000000000  1517443200000000000  1519862400000000000  

我错过了什么吗?有没有其他方法可以达到所需格式的日期?

我甚至尝试过:

for i in df2.iloc[1, 1:]:
    i = datetime.datetime.fromtimestamp(int(i)).strftime('%Y-%m-%d %H:%M:%S')

但是提供ValueError: timestamp out of range for platform localtime()/gmtime() function

3 个答案:

答案 0 :(得分:2)

在我看来,您应该转置数据框并使用dateutil.parser,这对日期输入格式更灵活。

在结构上,当你有固定类型的系列(或列)时,pandas效果最好,最直观。

<强>设置

import pandas as pd
from dateutil import parser

df2 = pd.DataFrame([['2017-18','','','','','','','','','','','',''], ['COMPANIES', '01-APR-2017', '01-MAY-2017', '01-JUN-2017', 
                    '01-JULY-2017', '01-AUG-2017', '01-SEP-2017', '01-OCT-2017', '01-NOV-2017', '01-DEC-2017', '01-JAN-2018', '01-FEB-2018', '01-MAR-2018']])

<强>解决方案

res = df2.T.iloc[1:, 1].apply(parser.parse)

<强>结果

print(res)

1    2017-04-01
2    2017-05-01
3    2017-06-01
4    2017-07-01
5    2017-08-01
6    2017-09-01
7    2017-10-01
8    2017-11-01
9    2017-12-01
10   2018-01-01
11   2018-02-01
12   2018-03-01
Name: 1, dtype: datetime64[ns]

答案 1 :(得分:1)

您可以使用strftime

访问.dt

<强>实施例

import pandas as pd
df2 = pd.DataFrame([['2017-18','','','','','','','','','','','',''], ['COMPANIES', '01-APR-2017', '01-MAY-2017', '01-JUN-2017', 
                    '01-JULY-2017', '01-AUG-2017', '01-SEP-2017', '01-OCT-2017', '01-NOV-2017', '01-DEC-2017', '01-JAN-2018', '01-FEB-2018', '01-MAR-2018']])


df2.iloc[1, 1:] = df2.iloc[1, 1:].str.replace("JULY", "JUL")
df2.iloc[1, 1:] = df2.iloc[1, 1:].apply(pd.to_datetime, format = '%d-%b-%Y').dt.strftime('%Y-%m-%d %H:%M:%S')

print(df2)

<强>输出:

          0                    1                    2                    3   \
0    2017-18                                                                  
1  COMPANIES  2017-04-01 00:00:00  2017-05-01 00:00:00  2017-06-01 00:00:00   

                    4                    5                    6   \
0                                                                  
1  2017-07-01 00:00:00  2017-08-01 00:00:00  2017-09-01 00:00:00   

                    7                    8                    9   \
0                                                                  
1  2017-10-01 00:00:00  2017-11-01 00:00:00  2017-12-01 00:00:00   

                    10                   11                   12  
0                                                                 
1  2018-01-01 00:00:00  2018-02-01 00:00:00  2018-03-01 00:00:00  

答案 2 :(得分:1)

您的时间戳保存在两个不同的行中。第一行包含一个时间戳和几个空条目。第二行包含字符串'COMPANIES'和日期时间作为字符串。现在,当您尝试将这些日期时间字符串解析为日期时间格式时,它们将被解析,然后转换为绝对数字日期格式,如1506816000000000000

这是因为pandas将第二行存储为dtype=object,因为它是混合类型:字符串和日期时间。
要正确表示日期时间,需要将它们存储在具有正确dtype的行/列中。 为了向您展示单独存储它们的效果:

dates = pd.to_datetime(df2.iloc[1, 1:], format = '%d-%b-%Y')

顺便说一句:为什么每个人都使用apply()?只是直接调用行/列上的函数就会更快,更直观。