Python 3.x 将时间戳系列取整为秒-然后保存为csv,无需ms/ns分辨率

Python 3.x 将时间戳系列取整为秒-然后保存为csv,无需ms/ns分辨率,python-3.x,pandas,export-to-csv,datetime-format,Python 3.x,Pandas,Export To Csv,Datetime Format,我有一个数据帧,df,带有索引:pd.DatetimeIndex。使用以下命令将单个时间戳从2017-12-04 08:42:12.173645000更改为2017-12-04 08:42:12: df.index = df.index.round("S") 当存储到csv时,将保留此格式(这正是我想要的)。我还需要一个仅限日期的列,现在可以轻松创建: df = df.assign(DateTimeDay = df.index.round("D")) 当使用df.to_csv()存储到csv

我有一个数据帧,df,带有索引:pd.DatetimeIndex。使用以下命令将单个时间戳从
2017-12-04 08:42:12.173645000
更改为
2017-12-04 08:42:12

df.index = df.index.round("S")
当存储到csv时,将保留此格式(这正是我想要的)。我还需要一个仅限日期的列,现在可以轻松创建:

df = df.assign(DateTimeDay = df.index.round("D"))
当使用
df.to_csv()
存储到csv文件时,会写出整个时间戳(
2017-12-04 00:00:00
),除非它是唯一要保存的列。因此,我在保存之前添加以下命令:

df["DateTimeDay"] = df["DateTimeDay"].dt.date
…csv文件看起来又很好了(
2017-12-04

问题描述 现在回到问题上来,我还有另外两个列,它们的时间戳与上面的格式相同(但是不同,并且有一些非常少的NAN)。我还想将它们四舍五入到秒(当然要将NaN保留为NaN),然后确保在写入csv时,它们不会被“低于第二分辨率”的零填充。无论我尝试什么,我都无法做到这一点

其他信息:

print(df.dtypes)
print(df.index.dtype)
…所有结果均为
datetime64[ns]
。如果我将它们转换为索引:

df["TimeCol2"] = pd.DatetimeIndex(df["TimeCol2"]).round("s")
df["TimeCol3"] = pd.DatetimeIndex(df["TimeCol3"]).round("s")
…它可以工作,但csv文件仍会使用不必要的零填充它们

最佳解决方案:不转换列(如上所述)或使用元素方式应用,除非它们很快(1亿多行)。我的梦想是这样的:

df["TimeCol2"] = df["TimeCol2"].round("s") # Raises TypeError: an integer is required (got type str)

在调用
到\u csv
时,可以指定
日期时间
数据类型的日期格式:

In[170]:
df = pd.DataFrame({'date':[pd.to_datetime('2017-12-04 07:05:06.767')]})
df

Out[170]: 
                     date
0 2017-12-04 07:05:06.767

In[171]:
df.to_csv(date_format='%Y-%m-%d %H:%M:%S')

Out[171]: ',date\n0,2017-12-04 07:05:06\n'
如果要对值进行四舍五入,则在写入csv之前,需要
四舍五入

In[173]:
df1 = df['date'].dt.round('s')
df1.to_csv(date_format='%Y-%m-%d %H:%M:%S')

Out[173]: '0,2017-12-04 07:05:07\n'

IIUC您可以在写入csv
df时指定日期格式。写入csv(文件\u pat,日期\u格式=“%Y-%m-%d%H:%m:%S”)
应该可以,您可以试试吗this@EdChum谢谢你,太棒了!唯一的问题是我仍然需要舍入。这将截断“亚秒值”,即
2017-12-04 07:05:06.767
应最终成为
2017-12-04 07:05:07
而不是
06
在写入csv之前,您仍然需要
舍入
值,因此
df['TimeCol2']=df['TimeCol2].dt.round('s'))
然后用param
date\u format=..
调用
到csv
应该可以,这对meI是有效的,我可以发誓我在
之前尝试了
dt
.round(“s”)
,但这解决了它。奇怪的是,至少在我的机器上,这样做更快:
df[“TimeCol2”]=pd.DatetimeIndex(df[“TimeCol2”]).round(“s”)
t=0.1729460秒,而
df[“TimeCol2”]=df[“TimeCol2”].dt.round(“s”)
t=0.2761543秒不知道,但是
日期时间索引
的结构比
系列
简单得多,因此可能涉及的间接寻址更少