我的csv的日期时间格式不正确。我已经研究出如何将这些值转换为所需的格式,但是现在我需要将列中的所有值重新分配给新的转换后的值。
例如,我希望可以在以下FOR循环中放入一些内容,这些值会将值重新插入数据帧中的正确位置:
for i in df[df.columns[1]]:
t = pd.Timestamp(i)
short_date = t.date().strftime('%m/%d/%Y').lstrip('0')
# Insert back into dataframe?
一如既往,非常感谢您的帮助!
该列的一部分: 有问题的数据框的一部分:
Created Date
2019-02-27 22:55:16
2019-01-29 22:57:12
2018-11-29 00:13:31
2019-01-30 21:35:15
2018-12-20 21:14:45
2018-11-01 16:20:15
2019-04-11 16:38:07
2019-01-24 00:23:17
2018-12-21 19:30:10
2018-12-19 22:33:04
2018-11-07 19:54:19
2019-05-10 21:15:00
答案 0 :(得分:1)
用最简单但最具启发性的术语:
df = pd.DataFrame({'x': [1, 2, 3], 'y': [4, 5, 6]})
df
# x y
# 0 1 4
# 1 2 5
# 2 3 6
df[:] = df[:].astype(float)
df
# x y
# 0 1.0 4.0
# 1 2.0 5.0
# 2 3.0 6.0
让pandas
为您完成工作。
或者,仅一列:
df.x = df.x.astype(float)
df
# x y
# 0 1.0 4
# 1 2.0 5
# 2 3.0 6
您当然可以将astype(float)
替换为.date().strftime('%m/%d/%Y').lstrip('0')
。
答案 1 :(得分:1)
要重新分配列,无需循环。这样的事情应该起作用:
import pandas as pd
events = pd.read_csv("df_events.csv")
events.set_index('index',inplace=True)
visits = pd.read_csv("df_visits.csv")
visits.set_index('index',inplace=True)
correct_delta = len(set(visits.visit_id) - set(events.visit_id))
print(correct_delta) #1670
filter_real_v = events.visit_id.isin(set(visits.visit_id))
bad_delta = filter_real_v.value_counts()
print(bad_delta[True]) #702680
df["column"] = new_column
是长度匹配的new_column
,或者是可以广播 1 到该长度的东西。您可以在docs中找到更多详细信息。
也就是说,如果Series
已经可以解析您的数据,则无需“格式化”。格式与时间戳实例无关。转换为类似pd.Timestamp
之类的字符串时,可以选择一种特殊的格式。
另一方面,如果您想更改时间戳的精度,则可以执行以下操作:
df["timestamp"].dt.strftime("%m/%d/%Y")
在这里,所有时间信息将四舍五入为几天。 df["timestamp"] = df["timestamp"].astype("datetime64[D]")
和[
之间的字母是分辨率。同样,所有这些以及更多内容都将在docs中进行讨论。
1 广播是]
中的一个概念,您可以在不同但形状兼容的阵列之间进行操作。同样,所有内容都包含在docs中。
答案 2 :(得分:0)
谢谢大家的帮助。所有答案都是有帮助的,但是我最终使用的答案如下:
import pandas as pd
df[df.columns[0]] = pd.to_datetime(df[df.columns[0]]).dt.strftime('%m/%d/%Y')