即使时间戳的值为零,如何保留时间戳的毫秒部分?

Joh*_*nny 6 python datetime pandas

我正在尝试用 Python 将数据写入 csv 文件。但是,我在编写时间戳时遇到了时间戳格式问题。

我的数据采用 UNIX 毫秒格式。to_datetime(unit = 'ms')我为此使用 pandas 内置方法。然而,我早期的很多数据都没有秒内记录。数据仅以截断的秒间隔存储。因此,虽然我希望我的数据像这样存储2015-01-01 00:00:00.000,但它却像这样存储2015-01-01 00:00:00并完全删除毫秒部分。到了今年,我确实有了可以写成的数据2020-01-01 00:01:07.748,例如。

我的代码中写这个的部分可以在这里看到:

df = pd.DataFrame(data, columns = ['Trade ID', 'Date', 'Amount', 'Price'])
                
df['Date'] = pd.to_datetime(df['Date'], unit = 'ms')
df.to_csv(csv_file_path, mode = 'a', header = False, index = False)
Run Code Online (Sandbox Code Playgroud)

我知道它与实际将其写入 csv 的行无关。因为它保留确实有秒内记录的记录的毫秒数据。我知道它位于将其从毫秒转换为日期时间的行中。我也尝试format在方法中使用该参数,但这会引发错误,因为您无法同时指定单位和格式。

Enc*_*kov 2

使用微秒(我不知道日期列中到底有什么)以及地图和切片(帖子中的最后一行)

df = pd.DataFrame({'datetime': {0: '2020/12/20 05:03:33.324',
                                1: '2020/12/20 05:03:55.33556'}})
print(df)
df['formatted'] = pd.to_datetime(df['datetime']).dt.strftime("%y-%m-%d %H:%M:%S.%f")
print(df)
df.to_csv("./dates.csv", mode = 'a', header = False, index = False)
Run Code Online (Sandbox Code Playgroud)

控制台输出

                    datetime
0    2020/12/20 05:03:33.324
1  2020/12/20 05:03:55.33556
                    datetime       date_time_formatted
0    2020/12/20 05:03:33.324  20-12-20 05:03:33.324000
1  2020/12/20 05:03:55.33556  20-12-20 05:03:55.335560
Run Code Online (Sandbox Code Playgroud)

在 csv 文件中:

2020/12/20 05:03:33.324,20-12-20 05:03:33.324000
2020/12/20 05:03:55.33556,20-12-20 05:03:55.335560
Run Code Online (Sandbox Code Playgroud)

从这里我检查了格式选项: https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior

事实上,使用地图和切片它可以工作:

df['with_map'] = pd.to_datetime(df['datetime']).dt.strftime("%y-%m-%d %H:%M:%S.%f").map(lambda date_time: date_time[:-3])
Run Code Online (Sandbox Code Playgroud)

使用 str 和 slice(感谢@MrFuppes)

df['dt_final'] = pd.to_datetime(df['datetime']).dt.strftime("%y-%m-%d %H:%M:%S.%f").str[:-3]
Run Code Online (Sandbox Code Playgroud)