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

标签 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:00+00:00,1

请注意,唯一的区别是第一行中的时区。当我读取第一个 csv 文件时,我得到时间戳作为 Python 日期时间(请注意,我只查看最后一行,在这两种情况下时间戳相同):

In [1]: import pandas as pd

In [2]: df_1 = pd.read_csv('data1.csv', parse_dates=['Timestamp'])

In [3]: df_1['Timestamp'].values[1]
Out[3]: datetime.datetime(2020, 5, 26, 10, 10, tzinfo=tzutc())

In [4]: df_1.iloc[1].Timestamp
Out[4]: datetime.datetime(2020, 5, 26, 10, 10, tzinfo=tzutc())

这样就好了。但是,当我对 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 或 Timestamps 的时间戳,具体取决于我们如何从 DataFrame 中提取它们。

烦人的是格式不一致。这是错误还是我做错了什么?

最佳答案

这是 pandas 的弱点:它本身不能表示具有混合时区的列。看 https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html#io-csv-mixed-timezones了解详情。 与那里写的相反,我得到了混合时区列的 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'>

关于python - 使用 Pandas 读取 csv 时间数据时数据类型不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62019416/

相关文章:

python - 使用 icalendar 使用 Python 解析 iCal 提要

python - 使用 pandas.to_datetime 转换时指定日期格式

python - 如何从 Python 中查看 Tumblr 帖子的所有注释?

Python Pandas 在一行中插入行数据

python - pandas 中 header 和 Skiprow 的区别不清楚

python - 如何在 Flask 中使用 Celery 为 session 添加值?

Python pandas,我可以倒序显示 value_counts() 吗?

python - pandas groupby 列来总结计数器性能

python - 计算 Pandas 数据框中两行 LDA 分布之间的距离

python - 删除不必要的内部标签