如果行中的日期大于或等于80天,则尝试从csv_file中删除行。
这是CSV_FILE :(所有内容都已读取并设置为CSV_FILE中的字符串)
2019-05-01 | 14
2019-05-02 | 16
2019-05-03 | 2
2019-05-04 | 3
2019-05-05 | 3
2019-05-06 | 6
2019-05-07 | 14
2019-05-08 | 8
2019-05-09 | 5
2019-05-10 | 1
2019-05-11 | 5
2019-05-12 | 4
2019-05-13 | 1
2019-05-14 | 2
2019-05-15 | 3
2019-05-16 | 8
2019-05-17 | 2
2019-05-18 | 3
2019-05-19 | 4
2019-05-20 | 4
这是我尝试过的:
s = pd.Series(pd.to_datetime('today') - pd.to_datetime(df.index[0])).dt.days df[s.le(80)].reset_index(drop=True).to_csv(csv_file, index=False)
不起作用,因为我尝试做的pd.Series失败。我目前正在研究的是通过df.drop()进行尝试,但我无法弄清楚出了什么问题并抛出错误。
实现的逻辑可以工作,但是它会根据布尔逻辑的[0]索引返回KeyError: True
或KeyError: False
的错误。
df = pd.read_csv(GLOBAL_PATH + csv_file, sep=',', index_col=0, encoding='utf-8', low_memory=False)
# print(df)
df.drop(df[(pd.to_datetime('today') - pd.to_datetime(df.index[0])).days >= 82].index, inplace=True)
如果第一个索引中的日期大于或等于80天,我将尝试从csv_file永久删除行。
任何帮助表示赞赏!谢谢!
-编辑-
对于仍在寻找的任何人。伊恩·汤普森(Ian Thompson)确实回答了这个问题,这就是我正在做什么的最终代码(顶部工作代码)。我确实也包括了我为解决此问题而一直在努力的所有其他代码,以防将来对其他人有帮助。
def remove_old_data(csv_file):
# WORKING CODE
df = pd.read_csv(GLOBAL_PATH + csv_file, sep=',', index_col=0, encoding='utf-8', low_memory=False)
# print(df) # Before Removal
df.drop(df.loc[(pd.to_datetime('today') - pd.to_datetime(df.index)).days >= 180].index, inplace=True)
# print(df) # After Removal
# Appended to CSV_FILE
df.to_csv(GLOBAL_PATH + csv_file)
# TEST OUT CODE
s1 = (pd.to_datetime('today') - pd.to_datetime(df.index)).days
print(s1, type(s1)) # Int64Index([84, 83, 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70, 69, 68, 67, 66, 65],
# dtype='int64', name='date') <class 'pandas.core.indexes.numeric.Int64Index'>
s2 = (pd.to_datetime('today') - pd.to_datetime(df.index[0])).days # Calculate the date difference
print(s2, type(s2)) # 82 <class 'int'>
zeroindex = df.index[0]
print(zeroindex, type(zeroindex)) # 2019-05-01 <class 'str'>
datestamp = pd.to_datetime(df.index[0])
print(datestamp, type(datestamp)) # 2019-05-01 00:00:00 <class 'pandas._libs.tslibs.timestamps.Timestamp'>
print(df.loc[s1 <= 80])
print(df.loc[(pd.to_datetime('today') - pd.to_datetime(df.index)).days <= 80])
# TEST DROP CODE
# df.drop(df[(pd.to_datetime('today') - pd.to_datetime(df.index[0])).days >= 82].index, inplace=True)
# df.drop(df[df.iloc[[0]].le((pd.to_datetime('today') - pd.to_datetime(df.index[0])).days >= 90)].index, inplace=True)
# NONE WORKING CODE / IN PROGRESS CODE
# Just days time == (pd.to_datetime('today') - pd.to_datetime(df.index[0])).days
# s = pd.Series(pd.to_datetime('today') - pd.to_datetime(df.index[0])).dt.days # Calculate the date difference
# print(s[0], type(s[0]), type(s)) # Result -- 57 <class 'numpy.int64'> <class 'pandas.core.series.Series'>
# df[s.le(55)]#.reset_index(drop=True).to_csv(csv_file, index=False)
# df2 = df.drop(axis=0, index=df.index[0], inplace=False).reset_index(drop=True).to_csv(csv_file, index=False)
# df2 = df.loc[df.index[0]].le(40).reset_index(drop=False)#.to_csv(csv_file, index=False, header=False, sep=',')
答案 0 :(得分:0)
在没有看到数据样本的情况下,很难诊断问题,但是我认为您可能在s
的定义中引用的是单个元素,而不是整个索引/系列。这是一些示例数据。
# random seed
np.random.seed(1)
# random data with datetime index
df = pd.DataFrame(index=pd.date_range('20190501', periods=100), data=np.random.randint(0, 10, size=(100,10)))
# show head
print(df.head())
0 1 2 3 4 5 6 7 8 9
2019-05-01 5 8 9 5 0 0 1 7 6 9
2019-05-02 2 4 5 2 4 2 4 7 7 9
2019-05-03 1 7 0 6 9 9 7 6 9 1
2019-05-04 0 1 8 8 3 9 8 7 3 6
2019-05-05 5 1 9 3 4 8 1 4 0 3
使用第一行代码会产生以下结果:
s = pd.Series(pd.to_datetime('today') - pd.to_datetime(df.index[0])).dt.days
print(s.head())
0 82
dtype: int64
如果您想过滤出大于或等于80的行,则应删除[0]
,以便拥有整个索引,而不是像这样的单行并且不转换为{{1} }:
pd.Series
然后您可以将其放入# I removed the [0],
# the conversion to a series,
# and the dt since it's not a series and therefore doesn't have the attribute
s = pd.to_datetime('today') - pd.to_datetime(df.index)).days
# s is now an index of integers
print(s)
Int64Index([ 82, 81, 80, 79, 78, 77, 76, 75, 74, 73, 72, 71, 70,
69, 68, 67, 66, 65, 64, 63, 62, 61, 60, 59, 58, 57,
56, 55, 54, 53, 52, 51, 50, 49, 48, 47, 46, 45, 44,
43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31,
30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18,
17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5,
4, 3, 2, 1, 0, -1, -2, -3, -4, -5, -6, -7, -8,
-9, -10, -11, -12, -13, -14, -15, -16, -17],
dtype='int64')
中进行过滤,并仅保留df
为s
(即不大于或等于< 80
的行):>
80