Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何防止Pandas将datetimes转换为datetime64 需要_Python_Pandas_Dataframe_Datetime - Fatal编程技术网

Python 如何防止Pandas将datetimes转换为datetime64 需要

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

我正在尝试将一个数据帧导出到一个拼花文件中,该文件稍后将在管道中被非Python或Pandas的东西使用。(Azure数据工厂)

当我稍后在流中接收拼花地板文件时,它无法识别
datetime64[ns]
。我宁愿只使用“普通”Python
datetime.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数据帧中创建一个普通的Python
datetime.datetime列(而不是Numpy/Pandas
datetime65[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
列).我并没有试图覆盖原始列,但我很确定它的行为应该是相同的。