Pandas 点格式日期

1 投票
1 回答
5846 浏览
提问于 2025-04-18 08:02

我想把一个叫做 Datetime 的列里的数据,比如 28.4.2014 12:20:49,转换成日期时间格式。但是当我这样做的时候

df = pd.read_csv('LOG.TXT', delim_whitespace=True, names=['Datetime', 'x'])
df['Datetime'] = pd.to_datetime(df['Datetime'])
print(df['Datetime'])

我得到的结果是 28.4.2014 2014-05-30 12:20:49,这是因为 Pandas 不能识别用点号分隔的日期格式。那么,有什么好的解决办法呢?

1 个回答

3

通常情况下,pandas应该能够自动处理这个问题,所以我觉得你的read_csv可能出了点问题:你的日期时间中有空格,但你又把空格当作分隔符,这样就会把日期和时间放在不同的列里。

举个例子:

In [67]: s = """28.4.2014 12:20:49 1
   ....: 29.4.2014 12:20:49 2"""

In [68]: from StringIO import StringIO 

In [69]: df = pd.read_csv(StringIO(s), delim_whitespace=True, names=['Datetime', 'x'])

In [70]: df
Out[70]: 
           Datetime  x
28.4.2014  12:20:49  1
29.4.2014  12:20:49  2

In [71]: df['Datetime'][0]
Out[71]: '12:20:49'

In [72]: pd.to_datetime(df['Datetime'][0])
Out[72]: Timestamp('2014-05-30 12:20:49')

这里日期被设置为索引,而时间则在Datetime这一列。当你用to_datetime来转换这个时间时,它会使用今天的日期。

要解决这个问题,有一种方法是(我把数据读入为三列,然后用parse_dates=[['Date', 'time']]把这两列合并成一个日期时间):

In [92]: df = pd.read_csv(StringIO(s), delim_whitespace=True,
   ....:                 names=['Date', 'time', 'x'], parse_dates=[['Date', 'time']])

In [93]: df
Out[93]: 
            Date_time  x
0 2014-04-28 12:20:49  1

不过如果你的格式比较特殊,你总是可以使用format这个关键词来处理:

In [66]: pd.to_datetime("28.4.2014 12:20:49", format="%d.%m.%Y %H:%M:%S")
Out[66]: Timestamp('2014-04-28 12:20:49')

撰写回答