【发布时间】:2018-11-17 07:09:57
【问题描述】:
我有一个数据框,df,索引为:pd.DatetimeIndex。使用出色的 pandas 舍入命令将各个时间戳从 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 文件仍然用不需要和不必要的零填充它们。
最佳解决方案:除非它们很快(100+ 百万行),否则不转换列(如上)或使用元素方式应用。我的梦想命令是这样的:
df["TimeCol2"] = df["TimeCol2"].round("s") # Raises TypeError: an integer is required (got type str)
【问题讨论】:
-
IIUC你可以在写入csv时指定日期格式
df.to_csv(file_pat, date_format='%Y-%m-%d %H:%M:%S')应该可以,你可以试试这个 -
@EdChum 谢谢,效果很好!唯一的问题是我仍然需要四舍五入。这会截断“亚秒值”,即
2017-12-04 07:05:06.767应该以2017-12-04 07:05:07而不是06结束 -
在写入 csv 之前您仍然需要
round值,所以df['TimeCol2'] = df['TimeCol2].dt.round('s')然后使用参数date_format=......调用to_csv应该可以工作,它对我有用
标签: python-3.x pandas export-to-csv datetime-format