Python 如何防止Pandas将datetimes转换为datetime64 需要
我正在尝试将一个数据帧导出到一个拼花文件中,该文件稍后将在管道中被非Python或Pandas的东西使用。(Azure数据工厂) 当我稍后在流中接收拼花地板文件时,它无法识别Python 如何防止Pandas将datetimes转换为datetime64 需要,python,pandas,dataframe,datetime,Python,Pandas,Dataframe,Datetime,我正在尝试将一个数据帧导出到一个拼花文件中,该文件稍后将在管道中被非Python或Pandas的东西使用。(Azure数据工厂) 当我稍后在流中接收拼花地板文件时,它无法识别datetime64[ns]。我宁愿只使用“普通”Pythondatetime.datetime 问题 但我无法做到这一点。问题在于,Pandas将任何“类似datetime的对象”重新放入数据帧或数据系列后,都会强制其进入datetime64[ns] 小例子 例如,假设iris数据集具有“timestamp”列: >>df
datetime64[ns]
。我宁愿只使用“普通”Pythondatetime.datetime
问题
但我无法做到这一点。问题在于,Pandas将任何“类似datetime的对象”重新放入数据帧或数据系列后,都会强制其进入datetime64[ns]
小例子
例如,假设iris数据集具有“timestamp”
列:
>>df.head()
萼片长度(厘米)萼片宽度(厘米)花瓣长度(厘米)花瓣宽度(厘米)类别时间戳
0 5.1 3.5 1.4 0.2塞托萨2021-02-19 15:07:24.719272
1 4.9 3.0 1.4 0.2塞托萨2021-02-19 15:07:24.719272
2 4.7 3.2 1.3 0.2塞托萨2021-02-19 15:07:24.719272
3 4.6 3.1 1.5 0.2塞托萨2021-02-19 15:07:24.719272
4 5.0 3.6 1.4 0.2塞托萨2021-02-19 15:07:24.719272
>>>df.dtypes
萼片长度(厘米)64
萼片宽度(厘米)64
花瓣长度(厘米)64
花瓣宽度(厘米)64
类别
时间戳datetime64[ns]
数据类型:对象
我可以将值转换为“普通Python日期时间”:
df.timestamp[1]
时间戳('2021-02-19 15:07:24.719272')
>>>类型(df.timestamp[1])
>>>df.timestamp[1]。to_pydatetime()
datetime.datetime(2021,2,19,15,7,24719272)
>>>类型(df.timestamp[1]。to_pydatetime())
但在转换整个列/系列时,我无法将其“保留”为该类型:
df['ts2']=df.timestamp.apply(lambda x:x.to_pydatetime())
>>>df.dtypes
萼片长度(厘米)64
萼片宽度(厘米)64
花瓣长度(厘米)64
花瓣宽度(厘米)64
类别
时间戳datetime64[ns]
ts2日期时间64[ns]
可能的解决方案
我想看看是否有什么办法可以“屏蔽”dataframe列并降低其日期时间的准确性。但我看不到任何东西。我也看不到通过df.to\u parquet()方法导出时指定列数据类型的选项
有没有办法在Pandas数据帧中创建一个普通的Pythondatetime.datetime列(而不是Numpy/Pandasdatetime65[ns]
列?在使用创建pydatetime时,请尝试强制使用dtype='object'
:
df['ts'] = pd.Series(df.timestamp.dt.to_pydatetime(),dtype='object')
df.loc[0,'ts']
输出:
datetime.datetime(2021, 2, 19, 15, 7, 24, 719272)
或者尝试干预类和继承查找super()Python中的函数只是好奇,为什么您希望Python的datetime在数据帧中,因为它不能很好地处理Pandas,将该系列转换为object。当您在Pandas
中工作时,您希望保留datetime64数据类型。如果我没记错的话,我以前在这里看到过类似的问题,我认为没有选择n强制将datetime.datetime列导出到parquet。也许可以选择使用ISO格式字符串?当然,您在另一端使用的工具将不得不再次解析为某个日期/时间数据类型,我猜…@QuangHoang,我需要datetime
,因为numpy/pandas之外的工具很少——特别是我的工具Azure Data工厂--了解datetime64[ns]
format。虽然仍在Python中,但我当然喜欢这种格式,我对它也很满意。但是这个脚本只是ELT链的一部分。Hi Quang。谢谢你的回答!这并没有完全解决我的问题。正如我上面所说的:我可以将序列转换为datetime,但随后数据帧将列转换回datetime64[ns]
自动。但你让我想到了最终的解决方案:只需将其强制为标准亚洲风格日期格式的字符串。这起到了作用。:@MikeWilliamson,如输出所示。具有对象数据类型的系列保留日期时间戳,即使将其连接回数据帧(如ts
列).我并没有试图覆盖原始列,但我很确定它的行为应该是相同的。