Pandas 熊猫处理“读取”csv的本地时间变化缓慢`
当从时区偏移(夏令时)发生变化的大型CSV文件中读取时,Pandas 熊猫处理“读取”csv的本地时间变化缓慢`,pandas,Pandas,当从时区偏移(夏令时)发生变化的大型CSV文件中读取时,parse_dates会变慢。你能建议我该如何处理这件事吗?对于某些工作,我确实转换为“UTC”,但我还需要使用原始的本地时间。有没有办法强制将列解析为datetime64[ns]而不是datetime64[ns,]?我认为添加列时间偏移可能是一种改进。我可能需要原始的naive时间戳 pd.__version__ '0.24.2' 随时间偏移变化 输出 df.date_time 0 2018-11-27 04:57:10+01:
parse_dates
会变慢。你能建议我该如何处理这件事吗?对于某些工作,我确实转换为“UTC”,但我还需要使用原始的本地时间。有没有办法强制将列解析为datetime64[ns]
而不是datetime64[ns,]
?我认为添加列时间偏移可能是一种改进。我可能需要原始的naive时间戳
pd.__version__
'0.24.2'
随时间偏移变化
输出
df.date_time
0 2018-11-27 04:57:10+01:00
1 2018-11-27 04:57:10+02:00
2 2018-11-27 04:57:10+02:00
3 2018-11-27 04:57:10+02:00
Name: date_time, dtype: object
df.date_time
0 2018-11-27 04:57:10+02:00
1 2018-11-27 04:57:10+02:00
2 2018-11-27 04:57:10+02:00
3 2018-11-27 04:57:10+02:00
Name: date_time, dtype: datetime64[ns, pytz.FixedOffset(120)]
我想我想要dtype:datetime64[ns]
无时间偏移更改
输出
df.date_time
0 2018-11-27 04:57:10+01:00
1 2018-11-27 04:57:10+02:00
2 2018-11-27 04:57:10+02:00
3 2018-11-27 04:57:10+02:00
Name: date_time, dtype: object
df.date_time
0 2018-11-27 04:57:10+02:00
1 2018-11-27 04:57:10+02:00
2 2018-11-27 04:57:10+02:00
3 2018-11-27 04:57:10+02:00
Name: date_time, dtype: datetime64[ns, pytz.FixedOffset(120)]
<> P>当您的数据在中间更改小时偏移量时,基于规则的字符串解析方法只会将这些偏移更改作为不同的未命名时区进行中继。Pandas的问题在于它将列表示为
对象
。要解决这个问题,我们需要显式地将每个值转换为单个命名时区。这使Pandas能够使用,例如,datetime64[ns,America/New_York]
作为列的类型,如果列中的所有值都具有相同的时区,它将自动执行此操作。更改的小时偏移量由该时区定义定义,因此信息将保留。缺点是,您必须知道指定的时区才能使用数据
我用了一些方法来评估速度差异。无论出于何种原因,内置的Pandas函数to_datetime()
速度非常慢。相反,我会根据您的数据建议一种替代方法,由您自己执行文本到日期时间的转换。以您喜欢的方式创建Pythondatetime
对象,应用时区,然后转换为PandasTimestamp
类型。如果您对具有快速字符串到ISO8601解析的外部ciso8601
库感到满意,可以使用以下方法。您还需要流行的pytz
库及其时区定义
假设您有一个名为filename
的CSV文件,它有一个Timestamp
列,其中包含ISO8601时间戳
导入ciso8601
作为pd进口熊猫
进口皮茨
时区='美国/纽约'
def自定义解析(val):
iso_time=ciso8601.parse_datetime(val)
tz_time=iso_时区(pytz时区)
pd_时间=pd.时间戳(tz_时间)
返回pd_时间
dt=pd.read\u csv(文件名,解析日期=['Timestamp'],日期解析=自定义解析)
如果您不想使用ciso8601
,可以用基于正则表达式的解析步骤或等替换iso\u-time=
步骤。几乎任何东西都比Pandas提供的to\u-datetime()
快