Python 使用Pandas读取csv时间数据时数据类型不一致

Python 使用Pandas读取csv时间数据时数据类型不一致,python,pandas,Python,Pandas,我正在使用Pandas读取带有时间数据的csv文件。我注意到时间戳的数据格式因时区而异。我不是这里的专家,所以我可能犯了一个错误。这里有一个简单的例子来说明我的意思 我有两个csv文件:data1.csv: Timestamp,State 2020-05-26T10:00:00+01:00,3 2020-05-26T10:10:00+00:00,1 和data2.csv: Timestamp,State 2020-05-26T10:00:00+00:00,3 2020-05-26T10:10:

我正在使用Pandas读取带有时间数据的csv文件。我注意到时间戳的数据格式因时区而异。我不是这里的专家,所以我可能犯了一个错误。这里有一个简单的例子来说明我的意思

我有两个csv文件:data1.csv:

Timestamp,State
2020-05-26T10:00:00+01:00,3
2020-05-26T10:10:00+00:00,1
和data2.csv:

Timestamp,State
2020-05-26T10:00:00+00:00,3
2020-05-26T10:10:00+00:00,1
请注意,唯一的区别是第一行中的时区。当我读取第一个csv文件时,我得到的时间戳是Python datetimes(注意,我只查看最后一行,在这两种情况下时间戳是相同的):

所以这很好。但是,当我对data2.csv执行相同操作时,我得到

In [5]: df_2 = pd.read_csv('data2.csv', parse_dates=['Timestamp'])

In [6]: df_2['Timestamp'].values[1]
Out[6]: numpy.datetime64('2020-05-26T10:10:00.000000000')

In [7]: df_2.iloc[1].Timestamp
Out[7]: Timestamp('2020-05-26 10:10:00+0000', tz='UTC')
现在我们有了Numpy datetime64或时间戳,这取决于我们如何从数据帧中提取它们


格式不一致令人恼火。这是一个bug还是我做错了什么?

这是pandas的一个弱点:它不能在本地表示带有混合时区的列。看见 详情请参阅。 与那里写的相反,我得到了混合时区列的python
datetime
类型(而不是
string
),但它应该回答您的问题

import pandas as pd
import io

print(pd.__version__)

s1 = """Timestamp,State
2020-05-26T10:00:00+01:00,3
2020-05-26T10:10:00+00:00,1"""

s2 = """Timestamp,State
2020-05-26T10:00:00+00:00,3
2020-05-26T10:10:00+00:00,1"""

print('\n----- default:')

df1 = pd.read_csv(io.StringIO(s1), parse_dates=['Timestamp'])
print(df1, '\n', df1.applymap(type))

df2 = pd.read_csv(io.StringIO(s2), parse_dates=['Timestamp'])
print(df2, '\n', df2.applymap(type))

print('\n----- with date_parser:')

df1 = pd.read_csv(io.StringIO(s1), parse_dates=['Timestamp'], date_parser=lambda col: pd.to_datetime(col, utc=True))
print(df1, '\n', df1.applymap(type))

df2 = pd.read_csv(io.StringIO(s2), parse_dates=['Timestamp'], date_parser=lambda col: pd.to_datetime(col, utc=True))
print(df2, '\n', df2.applymap(type)) 
输出:

1.0.3

----- default:
                   Timestamp  State
0  2020-05-26 10:00:00+01:00      3
1  2020-05-26 10:10:00+00:00      1
                      Timestamp          State
0  <class 'datetime.datetime'>  <class 'int'>
1  <class 'datetime.datetime'>  <class 'int'>
                  Timestamp  State
0 2020-05-26 10:00:00+00:00      3
1 2020-05-26 10:10:00+00:00      1
                                            Timestamp          State
0  <class 'pandas._libs.tslibs.timestamps.Timesta...  <class 'int'>
1  <class 'pandas._libs.tslibs.timestamps.Timesta...  <class 'int'>

----- with date_parser:
                  Timestamp  State
0 2020-05-26 09:00:00+00:00      3
1 2020-05-26 10:10:00+00:00      1
                                            Timestamp          State
0  <class 'pandas._libs.tslibs.timestamps.Timesta...  <class 'int'>
1  <class 'pandas._libs.tslibs.timestamps.Timesta...  <class 'int'>
                  Timestamp  State
0 2020-05-26 10:00:00+00:00      3
1 2020-05-26 10:10:00+00:00      1
                                            Timestamp          State
0  <class 'pandas._libs.tslibs.timestamps.Timesta...  <class 'int'>
1  <class 'pandas._libs.tslibs.timestamps.Timesta...  <class 'int'>
1.0.3
-----默认值:
时间戳状态
0  2020-05-26 10:00:00+01:00      3
1  2020-05-26 10:10:00+00:00      1
时间戳状态
0
1.
时间戳状态
0 2020-05-26 10:00:00+00:00      3
1 2020-05-26 10:10:00+00:00      1
时间戳状态
0
1.0.3

----- default:
                   Timestamp  State
0  2020-05-26 10:00:00+01:00      3
1  2020-05-26 10:10:00+00:00      1
                      Timestamp          State
0  <class 'datetime.datetime'>  <class 'int'>
1  <class 'datetime.datetime'>  <class 'int'>
                  Timestamp  State
0 2020-05-26 10:00:00+00:00      3
1 2020-05-26 10:10:00+00:00      1
                                            Timestamp          State
0  <class 'pandas._libs.tslibs.timestamps.Timesta...  <class 'int'>
1  <class 'pandas._libs.tslibs.timestamps.Timesta...  <class 'int'>

----- with date_parser:
                  Timestamp  State
0 2020-05-26 09:00:00+00:00      3
1 2020-05-26 10:10:00+00:00      1
                                            Timestamp          State
0  <class 'pandas._libs.tslibs.timestamps.Timesta...  <class 'int'>
1  <class 'pandas._libs.tslibs.timestamps.Timesta...  <class 'int'>
                  Timestamp  State
0 2020-05-26 10:00:00+00:00      3
1 2020-05-26 10:10:00+00:00      1
                                            Timestamp          State
0  <class 'pandas._libs.tslibs.timestamps.Timesta...  <class 'int'>
1  <class 'pandas._libs.tslibs.timestamps.Timesta...  <class 'int'>